Я рассматривал это в течение последних нескольких дней, и до сих пор я действительно не нашел ничего убедительного, кроме догматических аргументов или призывов к традиции (т.е. "это С++-путь!" ).
Если я создаю массив объектов, что является убедительной причиной (кроме простоты) для использования:
#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);
над
#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);
У меня есть причина убедительной. Призывы к тому, что его С++ (а не C) и, следовательно, malloc
и free
не должны использоваться, не являются - насколько я могу судить - убедить столько, сколько это догматический. Есть ли что-то, что мне не хватает, что делает new []
выше malloc
?
Я имею в виду, насколько я могу судить, вы вообще не можете использовать new []
- для создания массива вещей, у которых нет конструктора без параметров без параметров, тогда как метод malloc
могут быть использованы.