為什麼析構函式中不能丟擲異常?

2021-10-07 08:00:20 字數 751 閱讀 7815

c++異常處理模型是為c++語言量身設計的,更進一步的說,它實際上也是為c++語言中物件導向而服務的。c++異常處理模型最大的特點和優勢就是對c++中的物件導向提供了最強大的無縫支援。那麼如果物件在執行期間出現了異常,c++異常處理模型有責任清除那些由於出現異常所導致的已經失效了的物件(也即物件超出了它原來的作用域),並釋放物件原來所分配的資源,這就是呼叫這些物件的析構函式來完成釋放資源的任務,所以從這個意義上說,析構函式已經變成了異常處理的一部分。

上面的論述c++異常處理模型它其實是有乙個前提假設——析構函式中是不應該再有異常丟擲的。

1)如果析構函式丟擲異常,則異常點之後的程式不會執行,如果析構函式在異常點之後執行了某些必要的動作比如釋放某些資源,則這些動作不會執行,會造成諸如資源洩漏的問題。

2)通常異常發生時,c++的機制會呼叫已經構造物件的析構函式來釋放資源,此時若析構函式本身也丟擲異常,則前乙個異常尚未處理,又有新的異常,會造成程式崩潰的問題。

解決方式就是把異常完全封裝在析構函式內部,決不讓異常丟擲函式之外。這是一種非常簡單,也非常有效的方法。

~

classname()

catch()

}

析構函式中不能丟擲異常的原因:

(1) 影響資源釋放等預定義的動作

(2) 引發更多的異常,導致程式崩潰

(3) 析構函式本身如果作為異常處理的一部分操作,不應該再丟擲異常

謝謝閱讀

不能在析構函式裡面丟擲異常

從語法上面講,析構函式丟擲異常是可以的,c 並沒有禁止析構函式引發異常,但是c 不推薦這一做法,從析構函式中丟擲異常是及其危險的。析構函式可能在物件正常結束生命週期時呼叫,也可能在有異常發生時從函式堆疊清理時呼叫。前一種情況丟擲異常不會有無法預料的結果,可以正常捕獲 但後一種情況下,因為函式發生了異...

不能在析構函式裡面丟擲異常

從語法上面講,析構函式丟擲異常是可以的,c 並沒有禁止析構函式引發異常,但是c 不推薦這一做法,從析構函式中丟擲異常是及其危險的。析構函式可能在物件正常結束生命週期時呼叫,也可能在有異常發生時從函式堆疊清理時呼叫。前一種情況丟擲異常不會有無法預料的結果,可以正常捕獲 但後一種情況下,因為函式發生了異...

析構函式丟擲異常

看了下effective c 關於析構函式丟擲異常的一些描述。然後自己網上查了下。發現一篇說的不錯的。轉了。具體出處不知道是 1.丟擲異常 1.1 丟擲異常 也稱為拋棄異常 即檢測是否產生異常,在c 中,其採用throw語句來實現,如果檢測到產生異常,則丟擲異常。該語句的格式為 throw 表示式 ...