我看到这样的代码:
void *NewElts = operator new(NewCapacityInBytes);
后来明确使用匹配的调用operator delete
。
为什么要这样做而不是:
void *NewElts = new char[NewCapacityInBytes];
为什么要显式调用operator new
和operator delete
??
答案 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可以清楚地向任何读取代码的人发出意图信号。