我有以下代碼:爲什麼不在異常未被捕獲到時調用析構函數?
#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在談論沒有try/catch時的情況,認爲這是關於何時拋出異常的問題。 – 2011-12-18 17:22:43
但是我現在刪除的答案仍然很重要 - 'Foo'沒有堆棧分配。 – 2011-12-18 17:23:20
我想知道爲什麼沒有堆棧解繞發生。如果有幾個塊級別,並且在下級錯誤被捕獲,那麼我會因爲FooPtr的aint釋放而導致內存泄漏? – bananov 2011-12-18 17:31:33