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

MFC_learner_1985 2011-06-06 08:30:29
More Effective C++ 中说应该避免异常信息传递到析构函数之外。因为有些时候异常处理的时候会调用析构函数,如果这个时候再有异常信息从析构函数之中传递到析构函数之外,就会导致程序终止。请问究竟什么时候异常处理会调用到析构函数?谁来详细解释一下?
...全文
200 9 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
qq120848369 2011-06-07
  • 打赏
  • 举报
回复
try里delete 就叫异常里析构,白讲那么多。
MFC_learner_1985 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lifesider 的回复:]

析构函数里出现异常,比如说内存写越界,delete异常,而且析构函数中没有捕获异常,这样异常就会抛出析构函数外
[/Quote]
我问的是什么时候异常处理的时候会调用析构函数,不是析构函数什么情况会进行异常处理。
lifesider 2011-06-06
  • 打赏
  • 举报
回复
析构函数里出现异常,比如说内存写越界,delete异常,而且析构函数中没有捕获异常,这样异常就会抛出析构函数外
qq120848369 2011-06-06
  • 打赏
  • 举报
回复
你应该懂的,你封装的类并且写了一个析构函数,析构函数里的代码可能有什么除0异常啊,什么异常的,如果你不在析构函数内部直接catch掉而是让它们继续往上抛出的话,这就不合理了。

别人拿你的类使用,析构对象的时候不知道你的析构函数还会出现什么除0异常之类的,它只知道可能delete的时候对象本身的内存会出问题(比如你越界访问内存导致该对象的一部分内存被改动过而导致内存释放时缺少必要的信息),但它并不知道你的析构函数竟然会抛出什么除0异常,所以你应该让析构函数自己做好自己份内的事。
qq120848369 2011-06-06
  • 打赏
  • 举报
回复
[Quote=引用 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。

谢谢。有没有不那……
[/Quote]

我给的例子不对,别看了。

其实也没什么例子,析构函数里的异常要在析构函数里直接try catch掉,因为析构函数本身负责对象的析构,并且紧接着就是编译器对象内存的释放,如果你只是捕获一个try{A *a=new A();delete a}catch(内存释放错误){}的话,只是捕获了内存释放时的错误bad_alloc之类的,析构过程中出现的异常你都没有处理就导致崩溃了,
qq120848369 2011-06-06
  • 打赏
  • 举报
回复
想错了。。。

其实书上的意思是析构函数里的异常最好在析构函数里解决掉,传出来就不好了。

MFC_learner_1985 2011-06-06
  • 打赏
  • 举报
回复
[Quote=引用 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。
[/Quote]
谢谢。有没有不那么特殊的例子?
qq120848369 2011-06-06
  • 打赏
  • 举报
回复
class A{public:~A(){throw bad_alloc()};

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

catch(A a),这个临时对象在离开catch{}时析构再次抛出异常,于是gameover。
無_1024 2011-06-06
  • 打赏
  • 举报
回复
这个没遇到过 顶一下 显示调用吧 个人认为
相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2011-06-06 08:30
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下