зачем вызывать оператор new явно - PullRequest
16 голосов
/ 10 ноября 2010

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

void *NewElts = operator new(NewCapacityInBytes);

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

Почему вместо:

void *NewElts = new char[NewCapacityInBytes];

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

Ответы [ 4 ]

25 голосов
/ 10 ноября 2010

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

Итак:

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

// Allocates space for N instances of T, and calls T's 
// 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));
6 голосов
/ 10 ноября 2010

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

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
2 голосов
/ 10 ноября 2010

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

1 голос
/ 11 ноября 2010

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

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

...