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