最近在工做中,接觸到兩次這個問題,一次是與Manager的每個月一次交流中,Manager問我這個問題,當時回答得支支吾吾;另一次是《Code View》學習小組會上,同事問到過這個問題。因此索性整理下來,以便本身明確。函數
首先是析構函數。學習
一. 析構函數spa
參照《Effective C++》中條款08:別讓異常逃離析構函數。.net
總結以下:對象
1. 不要在析構函數中拋出異常!雖然C++並不由止析構函數拋出異常,但這樣會致使程序過早結束或出現不明確的行爲。blog
2. 若是某個操做可能會拋出異常,class應提供一個普通函數(而非析構函數),來執行該操做。目的是給客戶一個處理錯誤的機會。內存
3. 若是析構函數中異常非拋不可,那就用try catch來將異常吞下,但這樣方法並很差,咱們提倡有錯早些報出來。資源
二. 構造函數get
總結以下:class
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
之後要堅持這樣小的總結,天天遇到不懂得問題就要及時搞清楚,不能讓不會的過夜!加油,晚安