gpt4 book ai didi

c++ - 当 operator delete() 被删除时,operator new() 的行为取决于默认构造函数的存在

转载 作者:行者123 更新时间:2023-12-01 09:09:53 30 4
gpt4 key购买 nike

使用运算符 new() 创建类 C 的新对象会在此处出现错误:

class C
{
public:
C() {}
virtual ~C() {}

void operator delete(void*) = delete;
};


int main()
{
C* c = new C;
}

C2280: 'void C::operator delete(void *)': function was explicitly deleted
但是当我更换 C() {}C() = default;或者删除该行以便编译器插入一个默认构造函数(我相信它与 = default 具有相同的效果),代码将编译并运行。

使这种情况发生的编译器生成的默认构造函数和用户定义的默认构造函数之间有什么区别?

我在 this posting 中得到了一些提示,但是这里的 C 类(没有用户提供的构造函数)并不是微不足道的,因为析构函数是虚拟的,对吧?

使用最新的 Visual Studio,c++17 编译。

最佳答案

What are the differences between compiler-generated default constructor and user-defined default constructor that make this happen?


new表达式调用相应的 operator new然后调用构造函数。如果构造函数抛出异常 new表达式必须撤销 operator new 的影响(避免内存泄漏)通过调用相应的 operator delete .如果删除后者 new表达式无法调用它,导致编译器 error: use of deleted function 'static void C::operator delete(void*)' .

A noexcept构造函数不可能抛出异常,因此,相应的 operator delete没有必要,因为它不会被 new 调用表达。 A default普通类的构造函数也是 noexcept构造函数。虚拟析构函数的存在需要 operator delete不会被删除,因为特殊的标量删除析构函数(通过基类指针启用 delete 表达式的实现细节)调用 operator delete .

C++标准似乎没有规定编译器是否必须要求 operator delete即使不可能被 new 调用,也不会被删除表达。 gcc但是,似乎没有调用相应的 operator deletenew如果是 delete,则完全没有表达式d(发布了 bug report)。

关于c++ - 当 operator delete() 被删除时,operator new() 的行为取决于默认构造函数的存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60184919/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com