【问题标题】:c++ destructor calls a delete operator?c ++析构函数调用删除运算符?
【发布时间】:2016-07-11 11:04:51
【问题描述】:

为什么我的 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。

【问题讨论】:

  • 它应该在 gcc5 中 compiles and works。如果在发布模式下编译会发生什么?
  • cpp.sh/3mqd - gcc 工作正常
  • 发布版本有同样的错误。这似乎是一个编译器错误?
  • MSVC2015 出现同样的错误!
  • 好吧,至少它并没有真正调用 thing::operator delete。 remove = delete 并在其中插入 printf() 不会执行。

标签: c++ destructor delete-operator


【解决方案1】:

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

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

【讨论】:

  • 析构函数不是虚拟的
  • 不是,而是使用显式方法名的调用称为非虚调用。
【解决方案2】:

此线程中的共识是这是 MSVC++ 独有的编译器错误。我已在此处向 Microsoft 报告此情况:

https://connect.microsoft.com/VisualStudio/Feedback/Details/2511044

更新:MS 报告该问题已解决,并将在下一次 VS 更新中提供。

【讨论】:

    猜你喜欢
    • 2014-03-13
    • 1970-01-01
    • 2016-05-25
    • 2014-09-12
    • 2013-02-06
    • 2017-04-04
    • 2012-03-13
    • 2014-06-19
    • 2012-02-12
    相关资源
    最近更新 更多