У меня есть следующий код:Почему деструкторы не называются, когда исключение не попадает в main?
#include <iostream>
#include <vector>
#include <tr1/memory>
struct FooError {};
struct Foo
{
~Foo() { std::cerr << "~Foo() executed" << std::endl; }
explicit Foo(unsigned int index) { if (5 == index) throw FooError(index); };
};
int main() {
typedef std::tr1::shared_ptr<Foo> FooPtr;
std::vector<FooPtr> foos;
for (unsigned int index = 0; index < 20; ++index)
{
try
{
foos.push_back(FooPtr(new Foo(index)));
}
catch (const FooError&)
{
std::cerr << "FooError caught" << std::endl;
}
}
}
Я вижу набор ~Foo()
выполняется, когда есть try{} catch{}
блоки. Когда нет обработчиков исключений, ничего не печатается. Означает ли это, что деструкторы объектов, связанных с стеком, вызывается при обработке исключения? Или ничего не печатается из-за проблем с буферизацией std :: cerr?
+1. Я не понимал, что OP говорит о ситуации, когда нет попытки/улова, подумал, что это происходит, когда исключение не выбрасывается. –
Но то, что осталось от моего удаленного ответа, по-прежнему важно - 'Foo' не выделяются в стеке. –
Интересно, почему не происходит раскручивание стека. Что, если есть несколько уровней блоков и ошибка попадает на нижнюю, у меня будут утечки памяти, потому что FooPtr не освобожден? – bananov