Удаляются ли статические объекты при возникновении исключения или только локальные объекты? - PullRequest
3 голосов
/ 21 июня 2011
#include <iostream>
#include <exception>
using std::cout;
using std::endl;
class test
{
 public:
    test()
    {
        cout<<"constructor called"<<endl;
    }
    ~test()
    {
        cout<<"destructor called"<<endl;
    }
    void fun(int x)
    {
       throw x;
    }
};

int main()
{
    try
    {
        static test k;          
        k.fun(3);
    }
    catch(int k)
    {
        cout<<"exception handler"<<endl;
    }
}

Когда генерируется исключение, то во время процесса раскрутки стека, я думаю, уничтожаются только локальные объекты, а не статические или кучные объекты. Если это правда, я не уверен, почему деструктор класса (тест) называется? Благодаря.

Ответы [ 3 ]

4 голосов
/ 21 июня 2011

Тестовый деструктор вызывается после основных выходов.

    catch(int k)
    {
        cout<<"exception handler"<<endl;
    }
    // Added this line
    std::cout << "Main Exiting\n";
}

Теперь тестирование

> g++ test.cpp
> ./a.out
constructor called
exception handler
Main Exiting
destructor called

Статические (объекты длительности статической памяти) уничтожаются в обратном порядке создания после основных выходов.

0 голосов
/ 21 июня 2011

При запуске этого кода я получаю вывод

constructor called
exception handler
destructor called

Что имеет смысл. Конструктор для статического объекта test вызывается первым. Когда выдается исключение, оно перехватывается обработчиком исключения и печатается сообщение. Наконец, когда программа завершается, вызывается деструктор для статического объекта test.

Исключения только заканчивают время жизни переменных с автоматической продолжительностью (т.е. локальных), предполагая, что исключение действительно где-то поймано. Исключения не будут уничтожать объекты с динамической длительностью (то есть вещи, выделенные с new), хотя, если в конструкторе возникает исключение для динамически размещаемого объекта, память будет возвращена, поскольку в противном случае нет способа вернуть память обратно. Точно так же static объекты не уничтожаются, так как они должны длиться всю программу. Если они были очищены, это может вызвать проблемы, если ссылки на эти объекты были переданы вокруг программы.

Надеюсь, это поможет!

0 голосов
/ 21 июня 2011

Деструктор вызван, потому что ваша программа завершается. Уничтожаются только объекты с автоматической продолжительностью хранения (то есть, определенно, не объекты стека или объекты кучи).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...