C++ 在各种故障情况下(例如,异常),是否可以在程序终止前使std::cout自动刷新

C++ 在各种故障情况下(例如,异常),是否可以在程序终止前使std::cout自动刷新,c++,cout,C++,Cout,如果抛出异常,则缺少刷新的标准输出会使诊断问题变得更加困难。是否有可以使用的缓解措施?(例如,终端挂钩、编译器标志等)。我可以理解在segfault中可能很难刷新,但我认为对于任意线程中的未捕获异常,至少在理论上是可能的 注意:由于可能使用多个线程,因此情况稍微复杂一些。因此,在main中捕获异常对其他线程不起作用。当程序由于未捕获异常而终止时,将调用std::terminate。这将调用已使用std::set\u terminate注册的终止处理程序。在这个终止处理程序中,您可以刷新标准输出流

如果抛出异常,则缺少刷新的标准输出会使诊断问题变得更加困难。是否有可以使用的缓解措施?(例如,终端挂钩、编译器标志等)。我可以理解在segfault中可能很难刷新,但我认为对于任意线程中的未捕获异常,至少在理论上是可能的


注意:由于可能使用多个线程,因此情况稍微复杂一些。因此,在
main
中捕获异常对其他线程不起作用。

当程序由于未捕获异常而终止时,将调用
std::terminate
。这将调用已使用
std::set\u terminate
注册的终止处理程序。在这个终止处理程序中,您可以刷新标准输出流

std::terminate
在其他一些情况下也被调用,例如将异常抛出
noexcept
函数、可接合
std::thread
的销毁、来自用户代码的直接调用等


如果程序被操作系统终止,这没有帮助。这只能通过以下方式解决。您可以尝试在信号处理程序中刷新作为一种不顾一切的措施,但这不能保证成功,也不能保证具有所需的行为,因为刷新不是异步安全操作。

当程序由于未捕获的异常而终止时,将调用
std::terminate
。这将调用已使用
std::set\u terminate
注册的终止处理程序。在这个终止处理程序中,您可以刷新标准输出流

std::terminate
在其他一些情况下也被调用,例如将异常抛出
noexcept
函数、可接合
std::thread
的销毁、来自用户代码的直接调用等


如果程序被操作系统终止,这没有帮助。这只能通过以下方式解决。您可以尝试在信号处理程序中刷新作为一种不顾一切的措施,但这并不能保证成功,也不能保证具有所需的行为,因为刷新不是异步安全操作。

为什么要标记此问题
c
?只需禁用缓冲。为什么不处理异常?发射时你不能在它们周围放一个试捕块,然后冲进去吗?对于SEGFULTS-您可以使用sigaction(在Linux/UNIX上)捕获SEGFULTS并尝试刷新内容-不保证-甚至可能会死锁,具体取决于故障发生时发生的情况。还要考虑到什么东西在写作后足够重要(尽管这样做太慢了)。如果你是认真的,你可以将消息写入共享内存区域,如果你的应用程序崩溃,这些信息不会丢失。@Barmar为什么不刷新缓冲区呢?禁用缓冲可能会影响性能,但这可能不一定是可以接受的。@eerorika,因为如果程序异常终止,您不一定可以这样做。为什么要标记此问题
c
?只需禁用缓冲。为什么不检查异常?发射时你不能在它们周围放一个试捕块,然后冲进去吗?对于SEGFULTS-您可以使用sigaction(在Linux/UNIX上)捕获SEGFULTS并尝试刷新内容-不保证-甚至可能会死锁,具体取决于故障发生时发生的情况。还要考虑到什么东西在写作后足够重要(尽管这样做太慢了)。如果你是认真的,你可以将消息写入共享内存区域,如果你的应用程序崩溃,这些信息不会丢失。@Barmar为什么不刷新缓冲区呢?禁用缓冲可能会对性能产生影响,这可能不一定是可以接受的。@eerorika,因为如果程序异常终止,您不一定可以这样做。@Barmar总比没有好。@Barmar I进行了一些扩展,指出所有故障情况都不在
std::terminate
@Barmar总比没有好。@Barmar I扩展一点,以说明
std::terminate