在不跳过析构函数的情况下停止执行

时间:2011-11-29 15:46:40

标签: c++ destructor terminate

是否可以在不跳过对析构函数的调用的情况下终止软件执行?例如,在下面的代码中,由于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))?

4 个答案:

答案 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注册函数中的每个实例。

相关问题