C ++ - 如果抛出异常,本地对象是否会释放?

时间:2015-12-27 14:31:27

标签: c++ exception

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

例如,在函数中:

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

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

3 个答案:

答案 0 :(得分:4)

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

如果没有处理程序,则由实现决定:

C ++11§15.5.1/ 2:
  

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

答案 1 :(得分:2)

是的,他们将被取消分配:

  • 首先,他们的析构函数(如果有的话)将被调用,
  • 然后他们的记忆将从自动存储区域中解除分配。

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

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

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

答案 2 :(得分:0)

当抛出异常时,应释放局部变量,因为throw子句将函数返回给调用函数。

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

将函数返回到some_function