2014-01-24 52 views
0

在析構函數中拋出異常有什麼缺點?在析構函數中拋出異常 - 缺點是什麼?

現在唯一的缺點是我可以看到它可能會停止釋放資源,還有其他缺點嗎?

+3

將異常另一個異常處於活動狀態(未捕獲)導致程序立即終止。 –

+1

舉個例子,你認爲這是一個好主意 – Rob

+0

@Rob我不認爲這是一個好主意,但我不明白爲什麼它不是,這就是爲什麼我問。小丑有一個好點 –

回答

6

如果由於展開堆棧來處理另一個異常而調用析構函數,那麼拋出將終止程序 - 一次不能有多個未處理的異常。

如果數組元素的析構函數拋出,那麼其餘元素的析構函數將不會被調用。這可能會導致內存泄漏和其他不良情況。

投擲析構器使得難以或不可能提供異常保證。例如,用於執行具有強大例外保證(即保證如果拋出異常,沒有任何變化)的「複製和交換」成語將失敗:

thing & thing::operator=(thing const & t) { 
    // Copy the argument. If this throws, there are no side-effects. 
    thing copy(t); 

    // Swap with this. Must have (at least) a strong guarantee 
    this->swap(copy); 
    // Now the operation is complete, so nothing else must throw. 

    // Destroy the copy (now the old value of "this") on return. 
    // If this throws, we break the guarantee. 
    return *this; 
} 
相關問題