Почему оператор call new явно

Я видел такой код:

void *NewElts = operator new(NewCapacityInBytes);

И соответствующий вызов явно operator delete используется позже.

Зачем это делать вместо:

void *NewElts = new char[NewCapacityInBytes];

Почему явный вызов operator new и operator delete??

Ответы

Ответ 1

Явный вызов operator new, называемый глобальным "сырым" оператором new. Global operator new возвращает необработанный блок памяти без вызова конструктора объекта или любых пользовательских перегрузок new. Таким образом, глобальный operator new похож на malloc на C.

Итак:

// Allocates space for a T, and calls T constructor,
// or calls a user-defined overload of new.
//
T* v = new T;

// Allocates space for N instances of T, and calls T 
// constructor on each, or calls a user-defined overload
// of new[]
//
T* v = new T[N];

// Simply returns a raw byte array of `sizeof(T)` bytes.
// No constructor is invoked.
//
void* v = ::operator new(sizeof(T));

Ответ 2

Если вы пишете:

T *p = new T;

Это выделяет достаточное количество памяти для хранения T, а затем строит T в нее. Если вы пишете:

T *p = ::operator new(sizeof(T));

Это выделяет достаточно памяти для хранения T, но не создает T. В один из случаев, когда вы можете увидеть это, люди также используют новое размещение:

T *p = ::operator new(sizeof(T)); // allocate memory for a T
new (p) T; // construct a T into the allocated memory
p->~T(); // destroy the T again
::operator delete(p); // deallocate the memory

Ответ 3

Если вы вызываете оператор new (bytesize), вы можете удалить его с помощью delete, тогда как если вы выделите через новый char [bytesize], то вам придется сопоставить его с помощью delete [], что является мерзостью избегать, когда это возможно. Скорее всего, это основная причина его использования.

Ответ 4

Используйте его, когда вы хотите выделить блок "необработанной" памяти и не хотите, чтобы что-либо было построено в этой памяти.

Существует небольшая практическая разница между распределением блока необработанной памяти и "конструированием" массива символов, но использование нового оператора явно свидетельствует о том, что вы хотите, чтобы кто-нибудь читал важный код.