malloc и размещение новых против новых - PullRequest
37 голосов
/ 22 января 2012

Я изучал это последние несколько дней, и до сих пор я не нашел ничего убедительного, кроме догматических аргументов или апелляций к традиции (т. Е. "это путь 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 таким образом можно использовать.

Ответы [ 11 ]

0 голосов
/ 22 января 2012
my_object * my_array=new my_object [10];

Это будет массив с объектами.

my_object * my_array=(my_object *)malloc(sizeof(my_object)*MY_ARRAY_SIZE);

Это будет массив размером ваших объектов, но они могут быть "разбиты". Например, если у вашего класса есть виртуальные функции, вы не сможете их вызывать. Обратите внимание, что не только ваши данные участника могут быть противоречивыми, но и весь объект фактически «сломан» (из-за отсутствия лучшего слова)

Я не говорю, что делать второй - неправильно, если вы это знаете.

...