【发布时间】:2012-01-08 23:04:04
【问题描述】:
是否可以在不跳过对析构函数的调用的情况下终止软件执行?例如,在下面的代码中,test 的析构函数将永远不会因为 exit(1) 语句而被调用。
#include <iostream>
#include <cstdlib>
using namespace std;
class A{
public:
A(){cout << "Constructed.\n";}
~A(){cout << "Destroyed.\n";}
};
void func()
{
//Assuming something went wrong:
exit(1);
}
int main(int argc, char *argv[])
{
A test;
func();
return 0;
}
我需要的是一种结束程序的方法(从func() 中),该程序在终止之前调用所有必要的析构函数。到目前为止,我一直在通过func() 返回值处理这个问题,如:
bool func()
{
//Assuming something went wrong:
return false;
}
int main(int argc, char *argv[])
{
A test;
if( !func() )return 1;
return 0;
}
这种方法的问题在于,一旦您需要将其应用于一系列嵌套函数,管理起来很快就会变得非常烦人(并且代码臃肿)。
有没有一种方法可以使用与第一个示例类似的语法(无论您身在何处都调用exit(1))来实现与第二个示例相同的结果(正确的析构函数调用)?
【问题讨论】:
-
你考虑过使用异常吗?如果你在函数中抛出异常,就会调用析构函数。
-
不要使用
exit;相反,抛出一个异常并在main级别捕获它。 -
这是异常的主要目的(允许执行析构函数)。
-
@Nerdtron:稍微更正:如果你抛出并捕获异常,析构函数将被调用。如果没有被捕获,那么是否调用它们是未指定的。
标签: c++ destructor terminate