【问题标题】:C++ - Do local objects deallocate if an exception is thrown? [duplicate]C++ - 如果抛出异常,本地对象是否释放? [复制]
【发布时间】:2016-04-01 14:06:08
【问题描述】:

我想知道在堆栈中分配的对象是否在抛出异常时被释放。

例如,在函数中:

void some_function()
{
    int i;
    std::string str;

    throw std::runtime_error{"Some error"};
}

【问题讨论】:

  • 是的;您可以通过使用打印消息的析构函数创建自定义类型来非常轻松地验证这一点。
  • 是的,如果函数在某个级别的 try 块中调用。我确定我至少看到过一个副本。
  • @juanchopanza stackoverflow.com/questions/8311457/… 怎么样?

标签: c++ exception


【解决方案1】:

如果有异常的处理程序,则保证本地对象的析构函数作为堆栈展开的一部分被调用。

如果没有处理程序,则取决于实现:

C++11 §15.5.1/2:

[…] 在没有找到匹配处理程序的情况下, 在调用std::terminate() 之前是否展开堆栈由实现定义。

【讨论】:

    【解决方案2】:

    是的,它们将被释放:

    • 首先,将调用它们的析构函数(如果有),
    • 然后他们的内存将从自动存储区中释放。

    第二部分通常通过移除分配对象的堆栈帧来实现。

    此功能是实现RAII 的基础,这是一种在 C++ 中进行异常安全资源管理的技术。

    注意:如果您的代码中没有定义异常处理程序,则允许程序在不调用析构函数的情况下终止,让操作系统处理释放程序所持有资源的任务.

    【讨论】:

      【解决方案3】:

      throw 子句将函数返回给调用函数时,应在引发异常时释放局部变量。

      考虑您的函数some_function()main() 调用。在这种情况下,throw 子句通过释放在some_function 中声明的局部变量将函数返回到main

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-19
        • 2012-01-04
        • 1970-01-01
        • 2010-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多