Остановить выполнение без пропуска деструкторов

Можно ли завершить выполнение программы без пропуска вызовов деструкторов? Например, в приведенном ниже коде деструктор для 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) , где бы вы ни находились)?

7
задан Malabarba 29 November 2011 в 15:46
поделиться