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