首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果我用"goto“跳出catch-block,我能保证异常对象是自由的吗?

如果我用"goto“跳出catch-block,我能保证异常对象是自由的吗?
EN

Stack Overflow用户
提问于 2011-09-01 04:11:40
回答 2查看 705关注 0票数 13

我有这样的代码:

代码语言:javascript
复制
try {
  doSomething();
} catch(InterruptException) {
  goto rewind_code;
}

if(0) {
rewind_code:
  longjmp(savepoint, 1);
}

我的问题是,当我从goto块中取出时,由C++运行时存储的异常对象是免费的吗?或者允许运行时缓存它,直到周围的函数存在或类似的东西?我只是想确保如果我多次执行上面的代码,每次回绕代码时,我都不会泄漏内存(因为longjmp不会执行编译器在函数程序中或之前发出的清理代码)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-01 04:32:50

§6.6/2:

从作用域退出时(无论如何完成),将为所有具有自动存储持续时间的构造对象调用析构函数(12.4) ...

至少在我读过的时候,“无论如何完成”应该/确实包括一个goto

编辑:好的,根据约翰尼斯的评论,我们关心的是§15.1/4:

当为异常执行的最后一个处理程序以除抛出以外的任何方式退出时为

;临时对象被销毁,并且实现可以为临时对象释放内存;

..。

销毁在处理程序中的异常声明中声明的对象销毁之后立即发生。

票数 11
EN

Stack Overflow用户

发布于 2011-09-01 04:57:31

§15.1.4

异常对象的内存以未指定的方式分配,除非在3.7.4.1中说明。如果处理程序通过重新抛出退出,则会将控制权传递给同一异常的另一个处理程序。异常对象在异常的最后一个剩余的活动处理程序通过除重新抛出之外的任何方法退出后销毁,或者在引用异常对象的最后一个std::exception_ptr (18.8.5)类型的对象被销毁后销毁。在前一种情况下,销毁发生在处理程序退出时,在销毁处理程序中的异常声明中声明的对象之后立即发生。在后一种情况下,销毁发生在std::exception_ptr的析构函数返回之前。然后,实现可以为异常对象释放内存;任何这样的释放都是以一种未指定的方式完成的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7262818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档