是否能在建構函式,析構函式中丟擲異常?

2022-03-21 01:12:55 字數 937 閱讀 8483

最近在工作中,接觸到兩次這個問題,一次是與manager的每月一次交流中,manager問我這個問題,當時回答得支支吾吾;另外一次是《code view》學習小組會上,同事問到過這個問題。所以索性整理下來,以便自己明確。

首先是析構函式。

一.  析構函式

參照《effective c++》中條款08:別讓異常逃離析構函式。

總結如下:

1. 不要在析構函式中丟擲異常!雖然c++並不禁止析構函式丟擲異常,但這樣會導致程式過早結束或出現不明確的行為。

2. 如果某個操作可能會丟擲異常,class應提供乙個普通函式(而非析構函式),來執行該操作。目的是給客戶乙個處理錯誤的機會。

3. 如果析構函式中異常非拋不可,那就用try catch來將異常吞下,但這樣方法並不好,我們提倡有錯早些報出來。

二.  建構函式

總結如下:

1. 建構函式中丟擲異常,會導致析構函式不能被呼叫,但物件本身已申請到的記憶體資源會被系統釋放(已申請到資源的內部成員變數會被系統依次逆序呼叫其析構函式)。

2. 因為析構函式不能被呼叫,所以可能會造

成記憶體洩露或系

統資源未被釋放。

3. 建構函式中可以丟擲異常,但必須保證在建構函式丟擲異常之前,把系統資源釋放掉,防止記憶體洩露。(如何保證???使用auto_ptr???)

最後總結如下:

1. 建構函式中盡量不要丟擲異常,能避免的就避免,如果必須,要考慮不要記憶體洩露!

2. 不要在析構函式中丟擲異常!

本文參考:

1. 《effective c++》條款08:別讓異常逃離析構函式。

2. c++建構函式中丟擲的異常

3. c++ 建構函式丟擲異常會引起記憶體洩漏嗎?:

4. 建構函式中可不可以丟擲異常?析構函式呢?

以後要堅持這樣小的總結,每天遇到不懂得問題就要及時搞清楚,不能讓不會的過夜!加油,晚安

建構函式和析構函式中丟擲異常

不會造成記憶體洩漏 1 new乙個物件有兩個過程 a.向系統申請記憶體空間 b.在申請的記憶體空間上執行建構函式,初始化物件。2 內部物件構造先於物件本身。3 物件在建構函式丟擲異常後,系統會負責清理構造物件時申請的記憶體,但不會呼叫物件析構函式。也就是說構造物件的記憶體會被釋放掉,已經完成例項化的...

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

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

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

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