为什么这个函数带有这个签名
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)
关键字new和operator new是不同的东西。
关键字的new作用是:
operator new分配内存。它可以针对正在分配的类型进行重载。关键字new接受传递给 的可选参数operator new,这允许放置new和非抛出new语法,请参阅#include <new>。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如果重载,则它是隐式静态的。