異常處理什么時候會調用析構函數?


More Effective C++ 中說應該避免異常信息傳遞到析構函數之外。因為有些時候異常處理的時候會調用析構函數,如果這個時候再有異常信息從析構函數之中傳遞到析構函數之外,就會導致程序終止。請問究竟什么時候異常處理會調用到析構函數?誰來詳細解釋一下?

9 个解决方案

#1


這個沒遇到過  頂一下  顯示調用吧  個人認為

#2


class A{public:~A(){throw bad_alloc()};

int main(){try{A *a=new A{}; delete a; }catch(A a){}}

catch(A a),這個臨時對象在離開catch{}時析構再次拋出異常,於是gameover。

#3


引用 2 樓 qq120848369 的回復:
C/C++ code
class A{public:~A(){throw bad_alloc()};

int main(){try{A *a=new A{}; delete a; }catch(A a){}}

catch(A a),這個臨時對象在離開catch{}時析構再次拋出異常,於是gameover。

謝謝。有沒有不那么特殊的例子?

#4


想錯了。。。

其實書上的意思是析構函數里的異常最好在析構函數里解決掉,傳出來就不好了。

#5


引用 3 樓 mfc_learner_1985 的回復:
引用 2 樓 qq120848369 的回復:

C/C++ code
class A{public:~A(){throw bad_alloc()};

int main(){try{A *a=new A{}; delete a; }catch(A a){}}

catch(A a),這個臨時對象在離開catch{}時析構再次拋出異常,於是gameover。

謝謝。有沒有不那……


我給的例子不對,別看了。

其實也沒什么例子,析構函數里的異常要在析構函數里直接try catch掉,因為析構函數本身負責對象的析構,並且緊接着就是編譯器對象內存的釋放,如果你只是捕獲一個try{A *a=new A();delete a}catch(內存釋放錯誤){}的話,只是捕獲了內存釋放時的錯誤bad_alloc之類的,析構過程中出現的異常你都沒有處理就導致崩潰了,

#6


你應該懂的,你封裝的類並且寫了一個析構函數,析構函數里的代碼可能有什么除0異常啊,什么異常的,如果你不在析構函數內部直接catch掉而是讓它們繼續往上拋出的話,這就不合理了。

別人拿你的類使用,析構對象的時候不知道你的析構函數還會出現什么除0異常之類的,它只知道可能delete的時候對象本身的內存會出問題(比如你越界訪問內存導致該對象的一部分內存被改動過而導致內存釋放時缺少必要的信息),但它並不知道你的析構函數竟然會拋出什么除0異常,所以你應該讓析構函數自己做好自己份內的事。

#7


析構函數里出現異常,比如說內存寫越界,delete異常,而且析構函數中沒有捕獲異常,這樣異常就會拋出析構函數外

#8


引用 7 樓 lifesider 的回復:
析構函數里出現異常,比如說內存寫越界,delete異常,而且析構函數中沒有捕獲異常,這樣異常就會拋出析構函數外

我問的是什么時候異常處理的時候會調用析構函數,不是析構函數什么情況會進行異常處理。

#9


try里delete 就叫異常里析構,白講那么多。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: