异常处理什么时候会调用析构函数?


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 联系我们: