哪位可以详尽地解释一下抛出异常时,开始的所谓"stack unwinding"(堆栈展开)过程!

aileen_long 2002-09-18 11:44:08
描述详细,解释清楚者拿分。
...全文
101 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
chinaeagle 2002-09-28
  • 打赏
  • 举报
回复
还是 jinfeng_wang(G-G-S,D-D-U)讲的明白
liubear 2002-09-27
  • 打赏
  • 举报
回复
来占个座位。

发个言吧。
当一个异常被抛出时,为了寻找能处理该异常的catch子句,需要从抛出异常的函数内开始,向上通过嵌套的函数调用链,直到找到该异常的catch子句为上去。这个过程被称作栈展开(stack unwinding).
在栈展开期间,随着函数调用链在catch子句的查找期间退出,每个函数执行的动作也被立即结束。在栈展开期间,由于栈被展开,每次一个复合语句或语句块退出时,如果在退出的块中有某个局部对象是类类型的,则在复合语句或函数退出时,栈展开过程将自动调用该对象的析构函数。
这样的话,如果一个资源被实现为一个类,并且"要求获得资源的动作"被封装在类的构造函数中,"释放资源的动作"被封装在类的析构函数中,那么一个函数带着未处理的异常退出时,函数中这种类类型的局部对象将被自动销毁。
熊主任 2002-09-27
  • 打赏
  • 举报
回复
我的一些理解
try
{
}
catch(...)
{
}
可以理解成函数,在try内有异常抛出后,清理栈内变量,但是有个问题,会早成内存泄漏,如果想避免的话,用个类把指针包起来,这样析构的时候回收这块内存就可以了。
waterstony 2002-09-27
  • 打赏
  • 举报
回复
假设函数B调用函数A
一个函数(A)内部抛出异常,如果这个函数(A)本身没有catch,那么这个异常会继续抛出到调用这个函数(A)的另一函数(B)当中。在异常继续抛出之前,函数A中的所有内部变量都要析构(从栈中释放)。如果B仍然没有catch这个异常,该异常继续抛出,B所有内部变量析构。一直到最外面(由系统catch调用abort)或者有某个函数catch了该异常。

一点浅见。
  • 打赏
  • 举报
回复
我来学习一下
aileen_long 2002-09-26
  • 打赏
  • 举报
回复
老师在吗?
liubear 2002-09-18
  • 打赏
  • 举报
回复
也占个座位吧。
C++ Primer中有一章也讲了异常,
cwanter 2002-09-18
  • 打赏
  • 举报
回复
google上能搜到不少啊!
cwanter 2002-09-18
  • 打赏
  • 举报
回复
这觉得你这个帖不可能自己删了,那就占个座位听听课吧:)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧