【发布时间】:2016-07-11 11:04:51
【问题描述】:
为什么我的 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。
【问题讨论】:
-
它应该在 gcc5 中 compiles and works。如果在发布模式下编译会发生什么?
-
cpp.sh/3mqd - gcc 工作正常
-
发布版本有同样的错误。这似乎是一个编译器错误?
-
MSVC2015 出现同样的错误!
-
好吧,至少它并没有真正调用 thing::operator delete。 remove = delete 并在其中插入 printf() 不会执行。
标签: c++ destructor delete-operator