为什么明确地调用operator new

时间:2010-11-10 14:40:57

标签: c++ memory-management new-operator

我看到这样的代码:

void *NewElts = operator new(NewCapacityInBytes);

后来明确使用匹配的调用operator delete

为什么要这样做而不是:

void *NewElts = new char[NewCapacityInBytes];

为什么要显式调用operator newoperator delete ??

4 个答案:

答案 0 :(得分:25)

明确地调用operator new就像调用全局“原始”运算符new一样。全局operator new返回原始内存块,而不调用对象的构造函数或new的任何用户定义的重载。基本上,全局operator new与C中的malloc类似。

所以:

// 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));

答案 1 :(得分:6)

如果你写:

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 :(得分:2)

如果你调用operator new(bytesize),那么你可以使用delete删除它,而如果你通过new char [bytesize]分配,那么你必须使用delete []来匹配它,这是一个在任何地方都可以避免的憎恶可能。这很可能是使用它的根本原因。

答案 3 :(得分:1)

当您想要分配一块“原始”内存并且不希望在该内存中构建任何内容时使用它。

分配原始内存块和“构建”字符数组之间几乎没有什么实际区别,但使用operator new可以清楚地向任何读取代码的人发出意图信号。