【发布时间】:2011-02-15 19:50:00
【问题描述】:
正如this answer 中提到的,简单地第二次调用析构函数已经是未定义的行为 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 条件的东西工作。因此,上面的代码需要破坏一些实现和/或平台细节。
为什么上面的代码会在什么情况下中断?
【问题讨论】:
-
好问题.....也许为什么我们不应该显式调用析构函数:D
-
它会在它中断的地方“中断”。我觉得这个问题毫无意义。
-
@Neil Butterworth:问题在于具体需要哪些实现细节。
-
它未定义,因为委员会无法猜测实现将如何实现删除操作。他们也不想浪费时间去猜测可能的实施方式。
-
“因此,上面的代码需要破坏一些实现和/或平台细节。”不,不是。您不能指望标准委员会列举每种可能的析构函数类型,并指定在某些实现下哪些可能会破坏,哪些可能不会破坏。 “不要对死物做任何事情”比“除非你知道它是安全的,否则不要对死物做任何事情”有用得多。
标签: c++ memory memory-management destructor undefined-behavior