最近在工作中,接觸到兩次這個問題,一次是與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
以後要堅持這樣小的總結,每天遇到不懂得問題就要及時搞清楚,不能讓不會的過夜!加油,晚安