【问题标题】:Curious about cout when there is a bus error on some next line当下一行出现总线错误时,对 cout 感到好奇
【发布时间】:2012-10-02 11:40:34
【问题描述】:

我很好奇 cout 如何处理总线/分段错误。我在下面粘贴了两个示例。因为我不知道如何复制您必须采取的总线错误,如果从我这里 grid.DoMovement,在这个例子中,抛出一个总线错误。当我在总线错误行之前计算某些内容时,我注意到如果我在其中放置一个 endline,它会很好地打印出来,但如果我不放一个 endl,它就不会。底部的例子说明了我的意思。
为什么如果您没有在 cout 中添加结束行,并且在后面的其中一行出现总线错误,它不会打印出“示例 2”?

示例 1:

std::cout << "example 1" << endl;
grid.DoMovement(); 

输出是

works
bus error

示例 2:

std::out << "example 2";
grid.DoMovement(); 

输出是

bus error

【问题讨论】:

    标签: c++ cout bus-error


    【解决方案1】:

    默认情况下 IOStreams 被缓冲。仅写入缓冲区的任何内容都不会显示。当您将std::endl 与流一起使用时,将添加换行符并刷新流。请注意,通常您希望刷新流:频繁刷新流可能会显着降低性能!因此,如果您想要换行符,最好不要使用std::endl 而使用'\n'。如果您真的想刷新流,可以显式使用 std::flush 来刷新流。

    在调试期间,让所有输出在写入后立即显示可能会有所帮助,这样崩溃不会阻止输出显示。如果您遵循上述建议并且不经常刷新,很多输出可能会被缓冲。解决此问题的简单方法是使用std::unitbuf:此操纵器打开标志std::ios_base::unitbuf 导致每次插入后刷新输出流。您可以使用 std::nounitbuf 再次关闭该标志,以避免已知可以工作(或者至少已知不会以过于戏剧性的方式失败)的代码部分变慢:

    std::cout << std::unitbuf;   // turn on automatic flushing
    problematic_code();
    std::cout << std::nounitbuf; // turn off automatic flushing
    

    std::ios_base::unitbuf 的默认设置是 std::cerrstd::clog 之间的差异:两者都流写入标准错误流(在 UNIX 文件描述符 2 上)但 std::cerr 在每次写入后刷新其缓冲区,而 @ 987654333@ 没有。

    【讨论】:

      【解决方案2】:

      endl 是一个“神奇”的操纵器,它输出换行符并刷新输出缓冲区。

      程序结束时缓冲区也正常刷新,所以你通常看不到endl的附加效果。但是,如果您的程序此后不久崩溃,则不会刷新缓冲区,并且不会出现输出。

      您可以将第二个示例更改为

      std::out << "example 2" << flush;
      

      看冲洗效果。

      【讨论】:

        【解决方案3】:

        std::endl 不仅向流中添加新行,还刷新输出流的当前缓冲区。如果在输出流缓冲区中有一些数据时出现总线错误,您将看不到数据。

        【讨论】:

          【解决方案4】:

          std::cout 被缓冲,std::cerr 不被缓冲。 如果您使用std::cerr 进行测试,无论是否使用std::endl,您都会看到您的消息。

          http://www.cplusplus.com/reference/iostream/manipulators/endl

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-01-05
            • 2015-12-19
            • 2012-09-10
            • 2011-03-23
            • 1970-01-01
            • 1970-01-01
            • 2013-09-07
            相关资源
            最近更新 更多