~Widget() { ... } // assume this might emit an exception
};
void doSomething()
{
std::vector v;
...
} // v is automatically destroyed here
當 vector v 被析構時,它有責任銷毀它包含的所有 Widgets。假設 v 中有十個 Widgets,在銷毀第一個的時候,拋出一個異常。其他 9個 Widgets 仍然必須被銷毀(否則他們持有的任何資源將被泄漏),所以 v 應該調用它們的析構函數。但是假設在這個調用期間,第二個 Widgets 的析構函數又拋出一個異?!,F在有兩個異常同時在活動中,對于 C++ 來說這太多了。在非常巧合的條件下發生這樣兩個同時活動的異常,程序的執行會終止或者引發未定義行為。在本例中,將引發未定義行為。與此相同,使用任何標準庫容器(比如,list,set),任何 TR1中的容器,甚至是一個數組,都可能會引發未定義問題。并非必須是容器或數組才會陷入麻煩。程序夭折或未定義行為是析構函數引發異常的結果,即使沒有使用容器或數組也會如此。C++ 不喜歡引發異常的析構函數。 這比較輕易理解,但是假如你的析構函數需要執行一個可能失敗而拋出異常的操作,該怎么辦呢?例如,假設你與一個數據庫連接類一起工作:
class DBConnection {
public:
...
static DBConnection create(); // function to return