C/C++:异常终止前刷新输出

use*_*436 3 c c++ io abort

是否需要在调用之前显式刷新输出流abort()以避免输出丢失?

据我所知,由于stderr没有缓冲,所以abort在输出后调用stderr/ cerr应该没问题.怎么样的stdout/ cout,或我打开的文件?

PS.我在Linux环境中工作(如果重要的话).

R..*_*R.. 10

是的,它是必需的,但不是,它可能是不可能的.如果您从异步信号上下文中止,则调用将fflush调用未定义的行为.通常,如果调用的原因abort是您在程序中检测到不一致的状态,则存在stdio状态也被破坏的风险,fflush因此调用是不安全的.

一般情况下,exit(1)如果由于程序无法处理的条件而终止,则应该使用,并且只有在检测到程序已调用未定义的行为时才使用abort()(不使用fflush),

更多细节:

C标准允许实现刷新stdio流作为中止的一部分(C11 7.22.4.1 :):

是否刷新具有未写入缓冲数据的开放流,关闭打开流,或者删除临时文件是实现定义的.

但是,abort如果从信号处理程序调用,则不会删除工作的要求.因为从实际的角度来看,如果abort从一个信号处理程序中调用缓冲区来缓冲缓冲区通常是不可能的,缓冲区处于不一致状态,那么任何试图使用这个容差的实现都可能是错误的.

当前版本的Linux手册页abort错误地指出:

如果abort()函数导致进程终止,则关闭并刷新所有打开的流.

对当前行为的更正确的陈述是尝试刷新但可能会失败或损坏您的数据.根据这个帖子,这个bug目前正在glibc中修复(也许修复程序已经提交了??)

http://www.sourceware.org/ml/libc-alpha/2013-05/msg00207.html