c ++析构函数调用删除操作符?

时间:2016-03-23 23:00:25

标签: 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 *)':尝试引用已删除的函数

如果我注释掉显式析构函数调用,则错误消失,暗示显式析构函数调用正在尝试调用operator delete(void *)。这没有直观意义。正如您可以从这里的代码中看到的那样,我已经管理了自己的内存,并且我不希望任何人在任何事情上调用delete。

2 个答案:

答案 0 :(得分:5)

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

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

提交错误

答案 1 :(得分:3)

这个帖子的共识是,这是MSVC ++独有的编译器错误。我在这里向微软报告过:

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

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