我想知道在抛出异常时是否会在堆栈中分配的对象被解除分配。
例如,在函数中:
void some_function()
{
int i;
std::string str;
throw std::runtime_error{"Some error"};
}
答案 0 :(得分:4)
如果存在异常的处理程序,则保证将本地对象的析构函数作为堆栈展开的一部分进行调用。
如果没有处理程序,则由实现决定:
C ++11§15.5.1/ 2:“ [...]在找不到匹配处理程序的情况下, 它是实现定义的,无论在调用
std::terminate()
之前是否展开堆栈。
答案 1 :(得分:2)
是的,他们将被取消分配:
第二部分通常是通过删除分配对象的堆栈帧来实现的。
此功能是实现RAII的基础,这是一种用于C ++中的异常安全资源管理的技术。
注意:如果您的代码中没有定义异常处理程序,则允许程序在不调用析构函数的情况下终止,让操作系统处理释放程序所拥有的资源的任务
答案 2 :(得分:0)
当抛出异常时,应释放局部变量,因为throw
子句将函数返回给调用函数。
请考虑some_function()
调用您的函数main()
。在这种情况下,throw
子句通过释放main
中声明的局部变量
some_function
。