当下一条线路上出现公交车故障时,对cout感到好奇
Curious about cout when there is a bus error on some next line
我很好奇cout是如何处理总线/分段错误的。我在下面粘贴了两个例子。因为我不知道如何复制一个总线错误,你必须从我那里得到这个网格。在本例中,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
默认情况下,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::cerr
和std::clog
之间的差异:两个流都写入标准错误流(在UNIXes文件描述符2上),但std::cerr
在每次写入后都会刷新其缓冲区,而std::clog
则不会。
std::endl
不仅向流中添加新行,还刷新输出流的当前缓冲区。如果在输出流缓冲区中有一些数据时出现总线错误,则不会看到这些数据。
std::cout
在std::cerr
未被缓冲时被缓冲。如果您使用std::cerr
进行测试,无论是否使用std::endl
,您都会看到您的消息。
http://www.cplusplus.com/reference/iostream/manipulators/endl
endl
是一个"神奇"的操纵器,它输出换行符并刷新输出缓冲区。
缓冲区通常也会在程序结束时刷新,因此您通常看不到endl
的额外效果。但是,如果您的程序在之后不久崩溃,缓冲区不会被刷新,输出也不会出现。
您可以将第二个示例更改为
std::out << "example 2" << flush;
看看冲洗的效果。
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- std::cout.imbue()多重调用
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 在 COUT 语句中使用 COUT 调用函数
- GCC 4.8.2 自动矢量化由于 cout 而失败
- std::cout输出int时出现编译错误
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- C++ Setter/Getter,cout 工作,printf 失败
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 结构元素名称要 cout?
- 使用模板类重载 cout
- 犰狳的 print() 方法和 cout 在从 Rcpp 调用时顺序不一致
- 带有 cout 的指针在C++
- cout 指针时的实际数字
- COUT 无法提供输出可能是由于内联组装
- C++程序在一定行后未正确编译[cout语句]
- 当下一条线路上出现公交车故障时,对cout感到好奇