一个关于在__try中使用有构造的类问题

clane 2003-10-20 04:33:00
编译时提示不能在__try中使用需要unwindding的局部类,有无办法可以解决这个问题的?
...全文
67 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
bullfinch 2003-10-23
  • 打赏
  • 举报
回复
用编译器指令/GX-
参看链接器错误C2712
clane 2003-10-20
  • 打赏
  • 举报
回复
en,你说的是try,catch
但我这里的问题是__try,__catch的SEH
而且我也没有在析构中抛出异常。。。
会思考的草 2003-10-20
  • 打赏
  • 举报
回复
局部对象在超出作用域后会进行析构,而一旦析构失败,会带来连锁反应。
C++的规则是你绝对不可以在另一个异常的被称为“栈展开(stack unwinding)”的过程中时,从析构函数抛出异常。举例来说,如果某人写了throw Foo(),栈会被展开,以至throw Foo()和 } catch (Foo e) { 之间的所有的栈页面被弹出。这被称为栈展开(statck unwinding)
在栈展开时,栈页面中的所有的局部对象会被析构。如果那些析构函数之一抛出异常(假定它抛出一个Bar对象),C++运行时系统会处于无法决断的境遇:应该忽略Bar并且在} catch (Foo e) { 结束?应该忽略Foo并且寻找 } catch (Bar e) { ?没有好的答案——每个选择都会丢失信息。
因此C++语言担保,当处于这一点时,会调用terminate()来杀死进程。突然死亡。
防止这种情况的简单方法是不要从析构函数中抛出异常。但如果你真的要聪明一点,你可以说当处理另一个异常的过程中时,不要从析构函数抛出异常。但在第二种情况中,你处于困难的境地:析构函数本身既需要代码处理抛出异常,还需要处理一些“其他东西”,调用者没有当析构函数检测到错误时会发生什么的担保(可能抛出异常,也可能做一些“其他事情”)。因此完整的解决方案非常难写。因此索性就做一些“其他事情”。也就是,不要从析构函数中抛出异常。
当然,由于总有一些该规则无效的境况,这些话不应该被“引证”。但至少99%的情况下,这是一个好规则。

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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