如果我跳出带有"goto"的捕获块,我能保证异常对象将被释放吗?

If I jump out of a catch-block with "goto", am I guaranteed that the exception-object will be free'ed?

本文关键字:对象 异常 释放 goto 如果      更新时间:2023-10-16

我的代码如下

try {
  doSomething();
} catch(InterruptException) {
  goto rewind_code;
}
if(0) {
rewind_code:
  longjmp(savepoint, 1);
}

我的问题是,当我goto离开catch块时,由c++运行时存储的异常对象是自由的吗?或者运行时是否允许缓存它,直到周围的函数存在或类似的东西?我只是想确保如果我多次执行上面的代码,每次使用倒带代码,我不会泄漏内存(因为longjmp不会执行编译器在函数序言中或之前发出的清理代码)。

§6.6/2:

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

至少在我看来,"无论多么成功"应该/确实包括一个goto

编辑:好的,根据Johannes的评论,我们关心的是§15.1/4:
的最后一个处理程序被执行时异常以除throw以外的任何方式退出;临时对象被销毁,实现可以为临时对象释放内存;

[…)

在异常声明中声明的对象的销毁之后立即发生销毁

§15.1.4

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