C++ 如果我用“跳出一个挡块”;“goto”;,我是否保证异常对象是自由的';预计起飞时间?

C++ 如果我用“跳出一个挡块”;“goto”;,我是否保证异常对象是自由的';预计起飞时间?,c++,exception,language-lawyer,abi,setjmp,C++,Exception,Language Lawyer,Abi,Setjmp,我有如下代码 try { doSomething(); } catch(InterruptException) { goto rewind_code; } if(0) { rewind_code: longjmp(savepoint, 1); } < P> >我的问题是,当C++代码运行> Goto 退出catch块时,C++运行时存储的异常对象是什么?或者允许运行时缓存它,直到周围的函数存在或类似的东西?我只是想确保,如果我多次执行上述代码,每次执行回放代码,我不会泄漏内存(因

我有如下代码

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

if(0) {
rewind_code:
  longjmp(savepoint, 1);
}
< P> >我的问题是,当C++代码运行> Goto <代码>退出catch块时,C++运行时存储的异常对象是什么?或者允许运行时缓存它,直到周围的函数存在或类似的东西?我只是想确保,如果我多次执行上述代码,每次执行回放代码,我不会泄漏内存(因为
longjmp
不会执行编译器在函数序言中或之前发出的清理代码)

§6.6/2:

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

至少在我读到的时候,“无论多么成功”都应该/确实包括一个
goto

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

当执行的最后一个处理程序 异常通过除抛出之外的任何方式退出;临时对象将被销毁,并且实现 可以取消分配临时对象的内存

[……]

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

§15.1.4

异常对象的内存以未指定的方式分配 除3.7.4.1中所述的情况外,其他方式。如果处理程序通过重新旋转退出, 控件传递给同一异常的另一个处理程序最新版本 异常对象在最后一个剩余活动的 异常处理程序通过除重试以外的任何方式退出,或 std::exception_ptr(18.8.5)类型的最后一个对象,它引用 异常对象被销毁,以较晚者为准。在前一种情况下, 当处理程序退出时,销毁发生在 销毁在中的异常声明中声明的对象 处理器,如果有的话。在后一种情况下,销毁发生在 std::exception_ptr的析构函数返回。届时可能会实施 释放异常对象的内存;任何此类解除分配 以未指定的方式完成


还有谁会问这个问题?:)我知道这是一个理论性的练习,但我忍不住要发布一个强制性的提示:当看到这段代码时,任何合理的编译器都应该发出一个
警告:你到底在干什么?
<代码>:)@Korn errm。不,不是。如果你对如何摆脱同样简单的
goto
有个好主意,我洗耳恭听。感谢您的慷慨见解!嗯,哎哟。混合使用
throw/catch
longjmp
似乎是自找麻烦。大麻烦。麻烦就在河城,各种各样的麻烦
longjmp
是一个C函数;从某种意义上说,它是C语言中的throw。C没有关于它如何对待C++的要求,C++对“<代码>”的定义如何。虽然我不是在问异常对象的副本。我看到catch子句的参数将被破坏。但我要问的是保留在幕后的原始异常对象,它很可能是在堆上分配的。即通过
throw重新调用的一个。啊,谢谢。我想这意味着我可以合理地确定内存是空闲的。哦,那一点看起来很熟悉D@Johannes:嗯,至少这意味着如果它没有被释放,你就有足够的理由提交错误报告。这是一个相当棘手的领域,我不确定标准的要求是否一定会转化为实际发生的情况(尽管今天的情况肯定比8年或10年前要好得多)。