为什么函数有这个签名
void* operator new (std::size_t size);
不能在这样的代码中调用
void* mem = new(100);
而是必须这样调用
void mem = ::operator new(100);
最佳答案
关键字 new
和 operator new
是不同的东西。
关键字 new
做:
- 调用
operator new
分配内存。它可以为正在分配的类型重载。 Keywordnew
accepts optional arguments传递给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;
}
在上面,如果 X 没有重载它的 operator new
,它是全局::operator new
被调用。注意 X::operator new
如果重载则隐式静态。
关于c++ - 全局新运算符调用语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22025588/