【发布时间】:2016-11-15 11:11:41
【问题描述】:
我把这段代码写成如下:
#include <iostream>
using namespace std;
class T
{
public:
T()
{
cout << "bb\n";
this -> ~T();
cout << "zz" << endl;
}
~T()
{
cout << "hello\n";
};
};
int main()
{
T a;
return 0;
}
已编辑
对不起,应该是T a; 而不是T a(),现在我得到了输出:
bb
hello
zz
hello
但我对结果感到困惑。为什么这个程序可以成功运行?
已编辑
我不认为我的问题是重复的。在我的代码中,构造函数在函数完成之前调用析构函数。但是,它在那个问题中明确调用了两次析构函数。
【问题讨论】:
-
最麻烦的解析。如果你解决了这个问题,肯定是 UB。
-
T a();-- 这不调用函数。同样,通常,您可以用 C++ 编写任何类型的废话,并且可以无错误地编译。所以我的建议是不要浪费太多时间试图找出无意义的代码。 -
如果不出意外,当
a超出范围,并且为已经销毁的对象调用析构函数时,将导致未定义的行为 -
@fredrik 看到 Hrishikesh Goyal 回答的变体,其中对象稍后不会再次被销毁。问题仍然是在构造函数中调用析构函数是否是未定义的行为
标签: c++