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