程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 是否能在構造函數,析構函數中拋出異常?

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

編輯:C++入門知識

  最近在工作中,接觸到兩次這個問題,一次是與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

 

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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved