是否可以在不跳过对析构函数的调用的情况下终止软件执行?例如,在下面的代码中,由于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)
)?
答案 0 :(得分:9)
抛出异常,在main
中抓住并返回。
除了重新抛出异常之外,没有别的东西可以捕获你的异常。
答案 1 :(得分:5)
您可以依赖stack unwinding:当您想退出时,抛出异常并在main()
中抓住它。
答案 2 :(得分:1)
struct my_exit
{
int error;
int operator()()
{
// do any cleanup on globals
return error;
}
};
int main()
{
try
{
doSomethingThatCouldCauseExit();
}
catch (my_exit & me)
{
// Clean up globals now
exit(me());
}
}
答案 3 :(得分:0)
有几种方法可以干净利落地完成这项工作。
一种解决方案是使用atexit
函数,该函数在程序终止时只调用给定的函数指针。
您必须从堆中分配所有对象,使用指向所有实例化类实例的指针维护一些全局表,然后简单地遍历表delete
注册函数中的每个实例。