尝试捕获和静态变量



假设我正在做这样的事情:

try
{
do_job();
}
catch(...)
{
std::cout << "GUI is running so we won't terminate and raise a clear error here instead" << std::endl;
};

当调用失败的do_job启动一些static变量/类时,它们是否在捕获后"销毁"?如果不是如何处理这个问题(即分配给静态的内存)?

我的一般问题是:我有一个 GUI 循环向用户显示东西,比如游戏,如果发生错误,程序会调用我猜std::termniate(),或者类似的东西,但我会发现自己在可爱的文件<abort>,然后 GUI 被破坏了,我该如何处理这个问题并重置调用do_job时创建的静态变量?我只是让他们发起的?在这种情况下,用户可能会改变主意,甚至不使用已创建的静态变量,因此它们在那里没有用占用内存?

静态存储持续时间变量,如果它们已成功初始化,将始终在正常程序终止时销毁,而不是更早。

如果静态变量未成功初始化,则不会销毁该变量。

无论如何,在正常情况下,您没有什么可以照顾的。特别是当从do_job抛出时,static要么在throw时完全初始化,要么没有。在前一种情况下,它将在正常程序终止时销毁,在后一种情况下,它不需要销毁。

std::terminate呼叫的情况下,它看起来有所不同。它在异常情况下调用,例如,如果未捕获异常或在堆栈展开过程中引发异常,或者异常转义noexcept函数。

默认std::terminate处理程序将调用异常终止程序的std::abort,并且显式不会破坏任何静态存储持续时间对象。程序只是突然终止,没有任何机会执行任何进一步的指令(除了SIGABRT处理程序)。

可以替换std::terminate处理程序,但是调用std::terminate的条件实际上不允许正常的程序终止,当然也不允许程序执行的合理延续。

最好的解决方案是不要让导致它被调用的异常情况发生。确保不要让异常从main、析构函数或noexcept函数中逸出。(还有更多std::terminate调用的来源。所有这些都应避免。

当调用失败的do_job启动一些静态变量/类时,它们是否在捕获后"销毁"?

具有静态存储持续时间的变量在main返回后被销毁(正常或调用std::exit)。

最新更新