是否可以在各种失败情况下(例如异常)在程序终止前自动刷新 std::cout

Is it possible to make std::cout flush automatically before program termination in various failure cases (e.g., exception)

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

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

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

std::terminate 在其他一些情况下也会被调用,例如从 noexcept 函数中抛出异常,破坏可连接 std::thread,直接从用户代码调用等

如果程序被操作系统终止,这没有帮助。那只能用disabling buffering来解决。您可以 尝试 将信号处理程序刷新为绝望的措施,但这不能保证成功,也不能保证有预期的行为,因为刷新不是异步安全操作。