为什么我的 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()
它就可以工作。但显然在这种情况下不涉及继承,因此两种形式之间没有区别。
您可以尝试通过 the Microsoft Connect site for VS 提交错误
关于c++析构函数调用删除运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36190330/