我在 terminate_handler 中进行了一些清理,并且有可能引发异常。我是否需要担心捕获它以防止对 terminate_handler 的递归调用?使用 gcc,这似乎不可能发生,我们只是进入中止。标准是这样还是行为未定义?
问问题
97 次
2 回答
4
不允许终止处理程序返回(§18.6.3.1/2);它必须结束程序(默认处理程序调用abort()
)。如果它包括:
void my_terminate()
{
throw 5;
}
你会得到未定义的行为,因为你会在没有终止程序的情况下离开函数(因为异常传播)。因此,如果您有可能抛出的代码,请确保捕获所有异常,如下所示:
void my_terminate()
{
try
{
// stuff
}
catch(...)
{
// too bad
}
abort();
}
但是(回答标题问题),我没有看到任何限制它再次输入的东西,所以这在技术上应该没问题:
void my_terminate()
{
static int counter = 0;
if (counter++ < 5)
terminate();
abort();
}
于 2010-08-23T23:14:50.753 回答
1
不,您不能从std::terminate
. 但是,您可以unexpected
从函数中抛出不同的异常。Terminate
就是这样做的——程序执行完成后终止。
编辑:
也就是说,你不应该做任何复杂的事情std::terminate
——如果你在里面,terminate
那么事情已经严重到你不应该继续尝试——而且你不应该尝试做一些事情,比如std::terminate
为同样的原因——如果程序由于内存不足而在那里怎么办?在那里你无能为力。
于 2010-08-23T23:09:59.457 回答