C++中构造函数和析构函数可以抛出异常吗?
生活随笔
收集整理的這篇文章主要介紹了
C++中构造函数和析构函数可以抛出异常吗?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C++中構造函數和析構函數可以拋出異常嗎?
一. ?析構函數
? ? ?參照《Effective C++》中條款08:別讓異常逃離析構函數。
?總結如下:
? ? ?1. 不要在析構函數中拋出異常!雖然C++并不禁止析構函數拋出異常,但這樣會導致程序過早結束或出現不明確的行為。
? ? ?2. 如果某個操作可能會拋出異常,class應提供一個普通函數(而非析構函數),來執(zhí)行該操作。目的是給客戶一個處理錯誤的機會。
? ? ?3. 如果析構函數中異常非拋不可,那就用try catch來將異常吞下,但這樣方法并不好,我們提倡有錯早些報出來。
二. ?構造函數
? ? ?總結如下:
? ? ?1. 構造函數中拋出異常,會導致析構函數不能被調用,但對象本身已申請到的內存資源會被系統(tǒng)釋放(已申請到資源的內部成員變量會被系統(tǒng)依次逆序調用其析構函數)。
? ? ?2. 因為析構函數不能被調用,所以可能會造成內存泄露或系統(tǒng)資源未被釋放。
? ? ?3. 構造函數中可以拋出異常,但必須保證在構造函數拋出異常之前,把系統(tǒng)資源釋放掉,防止內存泄露。(如何保證???使用auto_ptr???)
?
最后總結如下:
1. 構造函數中盡量不要拋出異常(可以),能避免的就避免,如果必須,要考慮不要內存泄露!
2. 不要在析構函數中拋出異常!
一. ?析構函數
? ? ?參照《Effective C++》中條款08:別讓異常逃離析構函數。
?總結如下:
? ? ?1. 不要在析構函數中拋出異常!雖然C++并不禁止析構函數拋出異常,但這樣會導致程序過早結束或出現不明確的行為。
? ? ?2. 如果某個操作可能會拋出異常,class應提供一個普通函數(而非析構函數),來執(zhí)行該操作。目的是給客戶一個處理錯誤的機會。
? ? ?3. 如果析構函數中異常非拋不可,那就用try catch來將異常吞下,但這樣方法并不好,我們提倡有錯早些報出來。
二. ?構造函數
? ? ?總結如下:
? ? ?1. 構造函數中拋出異常,會導致析構函數不能被調用,但對象本身已申請到的內存資源會被系統(tǒng)釋放(已申請到資源的內部成員變量會被系統(tǒng)依次逆序調用其析構函數)。
? ? ?2. 因為析構函數不能被調用,所以可能會造成內存泄露或系統(tǒng)資源未被釋放。
? ? ?3. 構造函數中可以拋出異常,但必須保證在構造函數拋出異常之前,把系統(tǒng)資源釋放掉,防止內存泄露。(如何保證???使用auto_ptr???)
?
最后總結如下:
1. 構造函數中盡量不要拋出異常(可以),能避免的就避免,如果必須,要考慮不要內存泄露!
2. 不要在析構函數中拋出異常!
總結
以上是生活随笔為你收集整理的C++中构造函数和析构函数可以抛出异常吗?的全部內容,希望文章能夠幫你解決所遇到的問題。