c++析构函数调用一个delete运算符



为什么我的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(),它就可以工作了。但显然,在这种情况下,没有涉及继承,因此这两种形式之间没有区别。

您可以尝试通过VS 的Microsoft Connect站点提交错误

这个线程中的共识是,这是MSVC++独有的编译器错误。我已经在这里向微软报告了这一点:

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

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

最新更新