【发布时间】:2011-03-18 12:24:54
【问题描述】:
在我看来,以下代码(来自一些 C++ 问题)应该导致 UB,但似乎不是。代码如下:
#include <iostream>
using namespace std;
class some{ public: ~some() { cout<<"some's destructor"<<endl; } };
int main() { some s; s.~some(); }
答案是:
some's destructor
some's destructor
我从 c++ faq lite 中了解到,我们不应该显式调用析构函数。我认为在显式调用析构函数之后,应该删除对象 s 。程序完成后会自动再次调用析构函数,应该是UB。不过我在g++上试了一下,得到的结果和上面的答案一样。
是不是因为类太简单了(不涉及新建/删除)?或者在这种情况下根本不是UB?
【问题讨论】:
-
未定义的行为的全部意义在于它是未定义的。它“有效”的事实只是无限可能之一。
-
这个析构函数太简单了,没有伤害效果。我相信调用析构函数并不是特例,只是简单的调用类的一个方法。它具有在被释放之前被调用的特殊情况(从删除或范围退出)。
-
@ereOn:谢谢。我知道它在 g++ 中“有效”并不意味着它不是“未定义”。但是,在线答案(可能不正确)不是 UB,这就是我感到困惑的原因。
-
@EXP0:您认为可能不正确的“在线答案”是什么?你能提供一个链接吗?谢谢。
-
您对析构函数的使用会调用 UB(因为它会导致对析构函数的两次调用),但在某些情况下您确实需要显式调用析构函数(当使用放置 new 时)。 Placement new 是一种边缘情况,除非(或直到)您需要这个不值得担心的高级功能。
标签: c++ destructor undefined-behavior