c++析构函数调用删除运算符?

标签 c++ destructor delete-operator

为什么我的 MSVC12 编译器不喜欢这样?

#include <new>

class thing
{
public:
    thing() {}
    ~thing() {}
    static void operator delete(void* ptr) = delete;
};

int main()
{
    int g;
    void* p = &g;
    thing* t1 = new(p) thing();
    t1->~thing();

    return 0;
}

我得到的错误奇怪地出现在 main() 的右大括号上:

错误 2 错误 C2280: 'void thing::operator delete(void *)' : 试图引用已删除的函数

如果我注释掉显式析构函数调用,错误就会消失,这意味着显式析构函数调用正在尝试调用运算符 delete(void*)。这没有直观的意义。正如您可能从这里的代码中看到的那样,我已经管理了自己的内存,并且我不希望任何人对事物调用 delete。

最佳答案

这绝对是一个错误 因为只需用非虚拟的替换对析构函数的虚拟调用: t1->thing::~thing() 它就可以工作。但显然在这种情况下不涉及继承,因此两种形式之间没有区别。

您可以尝试通过 the Microsoft Connect site for VS 提交错误

关于c++析构函数调用删除运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36190330/

相关文章:

C++ 关于追踪访问冲突的任何建议?

c++ - new 或 new[] 运算符

c++ - 正确删除 с++ 中的类

c++ - 关于堆清理的 C++ 约定理论,一个建议的构建,是好的做法吗?

c++ - 后缀表达式求值

c++ - 如何解决模板问题以将不同的数据类型保存到文件中?

c# - 我什么时候应该创建析构函数?

c++ - 输入语句 block 时是否会创建一个新的堆栈框架?

c++ - 我如何有效地遍历多种类型的树?

c++ - 为什么不以相反的顺序为对象数组调用析构函数?