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

C++ c++;析构函数调用删除运算符?,c++,destructor,delete-operator,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();

为什么我的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;
}
#包括
阶级事务
{
公众:
事物(){}
~thing(){}
静态void操作符delete(void*ptr)=delete;
};
int main()
{
int g;
void*p=&g;
事物*t1=新(p)事物();
t1->~事物();
返回0;
}
我得到的错误奇怪地出现在main()的右大括号上:

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

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

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


您可以尝试通过

提交该错误。该线程的共识是,这是MSVC++特有的编译器错误。我已在此处向Microsoft报告:


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

gcc5中应提供该问题。如果在发布模式下编译会发生什么gcc works Finelease生成具有相同的错误。这似乎是一个编译器错误?MSVC2015也有同样的错误!好吧,至少它不是真正调用thing::operator delete。removing=delete并在其中插入printf()不会执行。析构函数不是virtualIt's not,但使用显式方法名的调用称为非虚拟调用。