Я изучал это в течение последних нескольких дней, и до сих пор я действительно не нашел ничего убедительного, кроме догматических аргументов или апелляций к традиции (например, "это C ++ way! »).
Если я создаю массив объектов, какова веская причина (кроме простоты) для использования:
#define MY_ARRAY_SIZE 10
// ...
my_object * my_array=new my_object [MY_ARRAY_SIZE];
for (int i=0;i<MY_ARRAY_SIZE;++i) my_array[i]=my_object(i);
over
#define MEMORY_ERROR -1
#define MY_ARRAY_SIZE 10
// ...
my_object * my_array=(my_object *)malloc(sizeof(my_object)*MY_ARRAY_SIZE);
if (my_object==NULL) throw MEMORY_ERROR;
for (int i=0;i<MY_ARRAY_SIZE;++i) new (my_array+i) my_object (i);
Насколько я могу судить, последнее намного эффективнее первого (поскольку вы не инициализируете память какими-то неслучайными значениями / вызываете конструкторы по умолчанию без надобности), и единственная разница на самом деле заключается в том, что один вы очищаете с помощью:
delete [] my_array;
, а другой вы очищаете:
for (int i=0;i<MY_ARRAY_SIZE;++i) my_array[i].~T();
free(my_array);
I ' m ушел по веским причинам. Апелляция к тому факту, что это C ++ (не C) и, следовательно, не следует использовать malloc
и free
, не является - насколько я могу судить - убедительным настолько, насколько это догматично . Мне что-то не хватает, что делает new []
лучше malloc
?
Я имею в виду, насколько я могу судить, вы даже не можете использовать new []
- вообще - для создания массива вещей, у которого нет конструктора по умолчанию без параметров, тогда как таким образом можно использовать метод malloc
.