如果我用"goto"跳出一个catch块,我保证异常对象是免费的吗?

Joh*_*itb 13 c++ exception abi language-lawyer longjmp

我有这样的代码如下

try {
  doSomething();
} catch(InterruptException) {
  goto rewind_code;
}

if(0) {
rewind_code:
  longjmp(savepoint, 1);
}
Run Code Online (Sandbox Code Playgroud)

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

Jer*_*fin 11

6.6节/ 2:

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

至少在我读到它的时候,"无论多么成就"应该/确实包括一个goto.

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

当为异常执行的最后一个处理程序以throw以外的任何方式退出时; 临时对象被销毁,实现可能会释放临时对象的内存;

[...]

在销毁处理程序中的exception-declaration中声明的对象后立即发生破坏.