正如这个答案中提到的,简单地第二次调用析构函数已经是未定义的行为 12.4/14(3.8)。
例如:
class Class {
public:
~Class() {}
};
// somewhere in code:
{
Class* object = new Class();
object->~Class();
delete object; // UB because at this point the destructor call is attempted again
}
在这个例子中,类的设计方式是可以多次调用析构函数——不会发生双重删除之类的事情。内存仍然在delete
被调用的地方分配——第一个析构函数调用不调用::operator delete()
释放内存。
例如,在 Visual C++ 9 中,上面的代码看起来可以工作。甚至 C++ 对 UB 的定义也没有直接禁止符合 UB 条件的东西工作。因此,上面的代码需要破坏一些实现和/或平台细节。
为什么上面的代码会在什么条件下中断?