c++ - 全局新运算符调用语法

标签 c++ new-operator

为什么函数有这个签名

void* operator new (std::size_t size);

不能在这样的代码中调用

void* mem = new(100);

而是必须这样调用

void mem = ::operator new(100);

最佳答案

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

关键字 new做:

  1. 调用operator new分配内存。它可以为正在分配的类型重载。 Keyword new accepts optional arguments传递给 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; 
}

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

关于c++ - 全局新运算符调用语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22025588/

相关文章:

c++ - 使指向基类指针的 std::vector 的指针指向派生类指针的 std::vector

c++ - boost::ptr_vector 构造函数

c++ - 如何在 go 中使用 .lib 和 .dll 文件调用预构建的 API?

C++__FILE__宏的类型是什么

c++以不止一种方式访问​​相同的元素

c++ - 使用参数创建新对象

c++ - 我们应该删除一个不是 new/malloc 的指针吗?

C++:如何用单个命令替换复杂的迭代?

c++ - 重载 C++ 新运算符时的大小信息

c++ - 通过连续内存实现多态性