Удаляются ли статические объекты при возникновении исключения или только локальные объекты?
#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 ответа
Тестовый деструктор вызывается после главных выходов.
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
Статические (статические объекты продолжительности хранения) уничтожаются в обратном порядке создания после основных выходов.
Деструктор вызван, потому что ваша программа завершается. Только объекты с автоматической продолжительностью хранения (то есть, определенно, не объекты стека или объекты кучи) уничтожаются.
При запуске этого кода я получаю вывод
constructor called
exception handler
destructor called
Что имеет смысл. Конструктор для статики test
Объект вызывается первым. Когда выдается исключение, оно перехватывается обработчиком исключения и печатается сообщение. Наконец, когда программа завершается, деструктор для статического test
объект вызывается.
Исключения только приводят к тому, что время жизни переменных с автоматической продолжительностью (то есть локальных) заканчивается, при условии, что исключение действительно где-то поймано. Исключения не будут уничтожать объекты с динамической продолжительностью (т.е. объекты, выделенные с new
), хотя, если в конструкторе возникает исключение для динамически распределяемого объекта, память будет восстановлена, поскольку в противном случае нет способа вернуть память обратно. Так же, static
объекты не уничтожаются, так как они должны длиться всю программу. Если они были очищены, это может вызвать проблемы, если ссылки на эти объекты были переданы вокруг программы.
Надеюсь это поможет!