为什么明确地调用operator new

zah*_*pov 16 c++ memory-management new-operator

我看到这样的代码:

void *NewElts = operator new(NewCapacityInBytes);
Run Code Online (Sandbox Code Playgroud)

并且明确地匹配调用operator delete随后使用.

为什么这样做而不是:

void *NewElts = new char[NewCapacityInBytes];
Run Code Online (Sandbox Code Playgroud)

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

Cha*_*via 26

operator new像这样明确地调用全局"原始"运算符new.Global operator new返回一个原始内存块,而不调用对象的构造函数或任何用户定义的重载new.所以基本上,全球operator new类似于mallocC.

所以:

// 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));
Run Code Online (Sandbox Code Playgroud)

  • @zaharpopov:一个例子是实现一个内存池,你可以在其中分配一个大块,池的用户将调用在块中创建对象的函数,而不是使用`new`.根据分配模式,这可以提供比"new"和"delete"更好的性能. (8认同)
  • 什么时候有用? (4认同)
  • 这个答案描述了`operator new`的作用,但它没有解释为什么我们使用`operator new(N)`而不是`new char [N]`.毕竟这就是问题所在. (2认同)

Stu*_*etz 7

如果你写:

T *p = new T;
Run Code Online (Sandbox Code Playgroud)

分配足够的内存来保存T,然后将T构造到其中.如果你写:

T *p = ::operator new(sizeof(T));
Run Code Online (Sandbox Code Playgroud)

这会分配足够的内存来保存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
Run Code Online (Sandbox Code Playgroud)