如果我跳出带有"goto"的捕获块,我能保证异常对象将被释放吗?
If I jump out of a catch-block with "goto", am I guaranteed that the exception-object will be free'ed?
我的代码如下
try {
doSomething();
} catch(InterruptException) {
goto rewind_code;
}
if(0) {
rewind_code:
longjmp(savepoint, 1);
}
我的问题是,当我goto
离开catch块时,由c++运行时存储的异常对象是自由的吗?或者运行时是否允许缓存它,直到周围的函数存在或类似的东西?我只是想确保如果我多次执行上面的代码,每次使用倒带代码,我不会泄漏内存(因为longjmp
不会执行编译器在函数序言中或之前发出的清理代码)。
§6.6/2:
在退出作用域时(无论如何完成),对所有具有自动存储持续时间的构造对象调用析构函数(12.4)…
至少在我看来,"无论多么成功"应该/确实包括一个goto
。
的最后一个处理程序被执行时异常以除throw以外的任何方式退出;临时对象被销毁,实现可以为临时对象释放内存;
[…)
在异常声明中声明的对象的销毁之后立即发生销毁
§15.1.4
异常对象的内存分配在一个未指定的方法,除非在3.7.4.1中提到。如果处理程序通过重新抛出退出,将控制传递给同一异常的另一个处理程序。的异常对象在最后剩余的活动之后被销毁异常处理程序以除重新抛出之外的任何方式退出,或者类型std::exception_ptr(18.8.5)的最后一个对象,它引用异常对象被销毁,以较晚者为准。在前一种情况下,销毁发生在处理程序退出时,紧接在类的异常声明中声明的对象的销毁Handler,如果有的话。在后一种情况下,销毁发生在std::exception_ptr的析构函数返回。然后实现可能为异常对象释放内存;任何这样的分配以未指定的方式完成。
相关文章:
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 对象初始化后在C++中显示 char 数组时的异常行为
- 如何捕获 C++ 内置异常对象
- 对象接收堆栈溢出异常 c++ 的排序向量
- 堆异常 -1073741510对象
- std::bad_weak_ptr对象构造后shared_from_this异常
- 如何捕获源自静态分配对象的构造函数的异常?
- 基于对象的两个属性的自定义比较器会引发异常
- 如果一个对象是在本地创建的,并在C++中作为异常抛出,那么本地对象如何在其范围之外有效,即在 catch 块中?
- 为什么内置类型的对象上的溢出会导致异常/未定义的行为?
- 如何防止构造函数在引发异常时创建对象
- std::system 实例化单一实例对象时的异常
- 异常对象的最后一个潜在销毁点
- 初始化引发异常的对象
- 调试器在异常C++时未挂起调试对象
- 通过引用派生类对象从基类对象执行向下转换时引发bad_cast异常
- 在 C++ 中的构造函数中引发异常时销毁对象的成员变量
- C++ 异常处理:将异常定义为对象
- 从函数中抛出内部对象异常合法吗