malloc и размещение новое по сравнению с новым

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

37
задан BlueRaja - Danny Pflughoeft 22 January 2012 в 21:53
поделиться