C++中构造函数和析构函数可以抛出异常吗?
生活随笔
收集整理的這篇文章主要介紹了
C++中构造函数和析构函数可以抛出异常吗?
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
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ù)拋出異常,但這樣會(huì)導(dǎo)致程序過早結(jié)束或出現(xiàn)不明確的行為。
? ? ?2. 如果某個(gè)操作可能會(huì)拋出異常,class應(yīng)提供一個(gè)普通函數(shù)(而非析構(gòu)函數(shù)),來執(zhí)行該操作。目的是給客戶一個(gè)處理錯(cuò)誤的機(jī)會(huì)。
? ? ?3. 如果析構(gòu)函數(shù)中異常非拋不可,那就用try catch來將異常吞下,但這樣方法并不好,我們提倡有錯(cuò)早些報(bào)出來。
二. ?構(gòu)造函數(shù)
? ? ?總結(jié)如下:
? ? ?1. 構(gòu)造函數(shù)中拋出異常,會(huì)導(dǎo)致析構(gòu)函數(shù)不能被調(diào)用,但對(duì)象本身已申請到的內(nèi)存資源會(huì)被系統(tǒng)釋放(已申請到資源的內(nèi)部成員變量會(huì)被系統(tǒng)依次逆序調(diào)用其析構(gòu)函數(shù))。
? ? ?2. 因?yàn)槲鰳?gòu)函數(shù)不能被調(diào)用,所以可能會(huì)造成內(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ù)拋出異常,但這樣會(huì)導(dǎo)致程序過早結(jié)束或出現(xiàn)不明確的行為。
? ? ?2. 如果某個(gè)操作可能會(huì)拋出異常,class應(yīng)提供一個(gè)普通函數(shù)(而非析構(gòu)函數(shù)),來執(zhí)行該操作。目的是給客戶一個(gè)處理錯(cuò)誤的機(jī)會(huì)。
? ? ?3. 如果析構(gòu)函數(shù)中異常非拋不可,那就用try catch來將異常吞下,但這樣方法并不好,我們提倡有錯(cuò)早些報(bào)出來。
二. ?構(gòu)造函數(shù)
? ? ?總結(jié)如下:
? ? ?1. 構(gòu)造函數(shù)中拋出異常,會(huì)導(dǎo)致析構(gòu)函數(shù)不能被調(diào)用,但對(duì)象本身已申請到的內(nèi)存資源會(huì)被系統(tǒng)釋放(已申請到資源的內(nèi)部成員變量會(huì)被系統(tǒng)依次逆序調(diào)用其析構(gòu)函數(shù))。
? ? ?2. 因?yàn)槲鰳?gòu)函數(shù)不能被調(diào)用,所以可能會(huì)造成內(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 和||运算
- 下一篇: 深入理解C++重载函数