为什么我的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。
答案 0 :(得分:5)
这绝对是个错误
因为只需用非虚拟的虚拟调用替换析构函数的虚拟调用:t1->thing::~thing()
就可以了。但显然在这种情况下不涉及继承,因此两种形式之间没有区别。
答案 1 :(得分:3)
这个帖子的共识是,这是MSVC ++独有的编译器错误。我在这里向微软报告过:
https://connect.microsoft.com/VisualStudio/Feedback/Details/2511044
更新:MS报告问题已解决,并将在下次VS更新中提供。