G ++编译器:Segfault处理

Ale*_*lex 2 c++ compiler-construction g++ stdout

我正在开发一个项目,我调用一个触发段错误的函数.我解决了这个问题,但在此过程中我发现了以下情况.

当我的代码是格式时;

main(){
  ...
  std::cout << "Looking for segfault\n"; // this does not print
  buggyFunction(); // crashes in here
  ...
}

buggyFunction(){
  ...
  thing_that_causes_segfault;
  ...
}
Run Code Online (Sandbox Code Playgroud)

"寻找段错误"行不会打印到STD,程序在buggyFunction中崩溃.很好,但是当我在buggyFunction()中添加一个cout行时;

main(){
  ...
  std::cout << "Looking for segfault\n"; // this now *does* print
  buggyFunction(); 
  ...
}

buggyFunction(){
  ...
  std::cout << "Now we're INSIDE buggy function\n"; // this prints too
  thing_that_causes_segfault;
  ...
}
Run Code Online (Sandbox Code Playgroud)

在马车内部功能,两行打印(然后它崩溃).

为什么我们在输出中看到这种差异,这取决于增加这个额外的输出调用?它与流的处理有关还是其他什么?我正在使用g ++(Ubuntu 4.4.3-4ubuntu5)4.4.3.

Pup*_*ppy 7

原因是它cout有一个缓冲区,它只会传递给系统函数并在缓冲区满时写入控制台.您的第二次使用cout恰好溢出缓冲区,因此它调用操作系统并清空缓冲区.如果要保证输出已离开缓冲区,则必须使用std::flush.您可以结束一行并刷新缓冲区std::endl.

  • 或者,您可以使用`std :: cerr`,它是无缓冲的(可能是出于错误报告的目的). (2认同)