我有这样的代码:
try {
doSomething();
} catch(InterruptException) {
goto rewind_code;
}
if(0) {
rewind_code:
longjmp(savepoint, 1);
}我的问题是,当我从goto块中取出时,由C++运行时存储的异常对象是免费的吗?或者允许运行时缓存它,直到周围的函数存在或类似的东西?我只是想确保如果我多次执行上面的代码,每次回绕代码时,我都不会泄漏内存(因为longjmp不会执行编译器在函数程序中或之前发出的清理代码)。
发布于 2011-09-01 04:32:50
§6.6/2:
从作用域退出时(无论如何完成),将为所有具有自动存储持续时间的构造对象调用析构函数(12.4) ...
至少在我读过的时候,“无论如何完成”应该/确实包括一个goto。
编辑:好的,根据约翰尼斯的评论,我们关心的是§15.1/4:
当为异常执行的最后一个处理程序以除抛出以外的任何方式退出时为
;临时对象被销毁,并且实现可以为临时对象释放内存;
..。
销毁在处理程序中的异常声明中声明的对象销毁之后立即发生。
发布于 2011-09-01 04:57:31
§15.1.4
异常对象的内存以未指定的方式分配,除非在3.7.4.1中说明。如果处理程序通过重新抛出退出,则会将控制权传递给同一异常的另一个处理程序。异常对象在异常的最后一个剩余的活动处理程序通过除重新抛出之外的任何方法退出后销毁,或者在引用异常对象的最后一个std::exception_ptr (18.8.5)类型的对象被销毁后销毁。在前一种情况下,销毁发生在处理程序退出时,在销毁处理程序中的异常声明中声明的对象之后立即发生。在后一种情况下,销毁发生在std::exception_ptr的析构函数返回之前。然后,实现可以为异常对象释放内存;任何这样的释放都是以一种未指定的方式完成的。
https://stackoverflow.com/questions/7262818
复制相似问题