全局新运算符调用语法

Lan*_*Pac 0 c++ new-operator

为什么这个函数带有这个签名

void* operator new (std::size_t size);
Run Code Online (Sandbox Code Playgroud)

不能在这样的代码中调用

void* mem = new(100);
Run Code Online (Sandbox Code Playgroud)

但它必须这样称呼

void mem = ::operator new(100);
Run Code Online (Sandbox Code Playgroud)

Max*_*kin 5

关键字newoperator new是不同的东西。

关键字的new作用是:

  1. 调用operator new分配内存。它可以针对正在分配的类型进行重载。关键字new接受传递给 的可选参数operator new,这允许放置new和非抛出new语法,请参阅#include <new>
  2. 调用对象的构造函数。
  3. 如果构造函数抛出异常,则调用相应的构造函数operator delete来释放内存。请注意,如果它operator delete不可访问(不是公共的),则new在编译时会失败,因为operator delete如果构造函数抛出异常,则无法调用,并且内存将丢失。

关键字new不能重载,它总是执行这些步骤。这是operator new第 1 步中可以重载的内容,通常与operator delete第 3 步一起。

换句话说,X* p = new X(a, b, c);在幕后做类似的事情(伪代码):

X* p = static_cast<X*>(X::operator new(sizeof(X))); // 1. allocate memory
try { 
    p->X(a, b, c); // 2. invoke the constructor
}                              
catch(...) { 
    X::operator delete(p); // 3. free the memory if the constructor throw
    throw; 
}
Run Code Online (Sandbox Code Playgroud)

在上面,如果 X 没有重载它的,则调用的operator new是全局的。::operator new请注意,X::operator new如果重载,则它是隐式静态的。