是否能在構造函數,析構函數中拋出異常?


  最近在工作中,接觸到兩次這個問題,一次是與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++構造函數中拋出的異常

    http://blog.csdn.net/deyili/article/details/6332760

3. C++ 構造函數拋出異常會引起內存泄漏嗎?:

    http://blog.csdn.net/sxf_824/article/details/4926687

4. 構造函數中可不可以拋出異常?析構函數呢?

    http://blog.csdn.net/panlong1987/article/details/1835454

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM