停止执行而不跳过析构函数
Stop execution without skipping destructors
是否有可能在不跳过对析构函数调用的情况下终止软件执行?例如,在下面的代码中,由于exit(1)
语句,test
的析构函数将永远不会被调用。
#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)
)?
抛出异常,在main
中捕获并返回。
你可以依靠堆栈展开:当你想退出时,抛出一个异常并在main()
中捕获它。
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());
}
}
有几种方法可以干净利落地做到这一点。
一个解决方案是使用atexit
函数,它在程序终止时简单地调用给定的函数指针。
您必须从堆中分配所有对象,维护一些带有指向所有实例化类实例的指针的全局表,然后在注册函数中迭代表delete
中的每个实例。
相关文章:
- 为什么即使调用了析构函数,C++11 中的分离线程也可以执行
- 是否可以访问类数据成员并在析构函数中对它们执行操作?
- 程序按执行方式工作,直到我向其添加析构函数为止
- 如何在析构函数中执行一些代码*在*成员被销毁之后
- 析构函数如何执行?
- 在执行std::函数析构函数时调用它
- C++:程序的执行(构造函数、析构函数、赋值运算符等)
- 执行析构函数时,服务器应用程序总是崩溃
- C++类组合 - 何时执行构造函数和析构函数
- 赋值重载显式调用析构函数(在执行其他二进制重载运算符之后)
- 有没有办法让C++类在开始执行析构函数之前自动执行方法
- 在C++QObject子类中调用析构函数之前执行操作
- c++中构造函数和析构函数的执行顺序
- 继承类的对象的析构函数执行
- 停止执行而不跳过析构函数
- 链表析构函数与Valgrind一起执行,但不能单独执行
- 执行"delete this"时缺少虚拟析构函数
- 继承层次结构:构造函数和析构函数执行顺序
- 在析构函数中执行任务
- 包装C++对象以用于C#PInvoke时的析构函数执行