【发布时间】:2015-08-09 21:45:37
【问题描述】:
C++ 标准第 3.6.1 节这样说
调用
<cstdlib>中声明的函数std::exit(int)终止 程序没有离开当前块,因此没有 销毁具有自动存储持续时间的任何对象 If std::exit 在销毁对象期间调用以结束程序 静态存储持续时间,程序具有未定义的行为。
所以,考虑以下简单的程序
#include <iostream>
#include <cstdlib>
class test
{
public:
test()
{
std::cout<<"constructor\n";
}
~test()
{
std::cout<<"destructor\n";
}
};
int main()
{
test t;
exit(0);
}
上面程序的输出应该是明显的
构造函数
所以,我的问题是:
自动对象t什么时候销毁?
它会被编译器安全销毁吗?
为什么是未定义的行为?
现在,考虑对上述程序稍作修改的版本。
#include <iostream>
#include <cstdlib>
class test
{
public:
test()
{
std::cout<<"constructor\n";
}
~test()
{
std::cout<<"destructor\n";
}
};
int main()
{
static test t;
exit(0);
}
现在,我得到以下输出:
构造函数
析构函数
那么,由于未定义的行为,是否可以仅将构造函数调用视为某些 C++ 实现的输出?
如果我理解不正确,请纠正我。
【问题讨论】:
-
旁注:调用
exit是为了程序员的利益。
标签: c++ destructor undefined-behavior