g++编译器:段错误处理
G++ compiler: Segfault handling
我正在做一个项目,我调用一个触发段错误的函数。我修复了这个问题,但在这个过程中,我注意到以下内容:
当我的代码的格式是;
main(){
...
std::cout << "Looking for segfaultn"; // this does not print
buggyFunction(); // crashes in here
...
}
buggyFunction(){
...
thing_that_causes_segfault;
...
}
"Looking for segfault"这行没有打印到STD,程序在buggyFunction中崩溃。很好,但是当我在buggyFunction();
中添加计算行时main(){
...
std::cout << "Looking for segfaultn"; // this now *does* print
buggyFunction();
...
}
buggyFunction(){
...
std::cout << "Now we're INSIDE buggy functionn"; // this prints too
thing_that_causes_segfault;
...
}
在有bug的函数中,两行都输出(然后崩溃)。
为什么我们在输出中看到这种差异,取决于这个额外的输出调用的添加?它是否与流的处理有关,还是其他什么?我使用g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3。
这样做的原因是cout
有一个缓冲区,它只会在缓冲区满时传递给系统函数并写入控制台。第二次使用cout
时恰好缓冲区溢出,因此它调用操作系统并清空缓冲区。如果你想保证输出已经离开缓冲区,你必须使用std::flush
。您既可以结束一行,也可以使用std::endl
刷新缓冲区。
因为您的行可能不会立即打印出来,因为它被缓存并且缓存没有"刷新"。std::endl
是换行符+刷新,因此强制立即输出:
std::cout << "Looking for segfault" << std::endl;
这与缓冲有关。写入cout
的内容被附加到内部缓冲区,该缓冲区只会周期性刷新。您可以通过将std::flush
写入流来显式刷新缓冲区,或者将"n"
替换为<< std::endl
。
相关文章:
- 错误处理.将系统错误代码映射到泛型
- 通过错误处理,在C++中可靠地获得用户十六进制输入
- posix_spawn():使用posix_scawn()时的错误处理问题
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 关于 istream 中的错误处理的问题
- 程序使用的 C 库中的错误处理C++
- C++ 错误检查 fstream open() 命令和一般字符串流错误处理
- 使用std::tie进行类似golang的错误处理,同时返回结果,是否有缺点?(C++11)
- Boost进程"系统"功能中的错误处理
- RPN计算器c++错误处理和多个运算符
- 提升精神 x3 错误处理程序与期望
- 构造函数中的错误处理而不会失败
- 当 C++ 中函数参数的输入类型(类)错误时的错误处理
- 关于 ocilib 错误处理的问题,如何使用 ocilib 正确捕获日志错误?
- 我可以使用 std::optional 进行错误处理吗?
- C++ main() 末尾关于错误处理的错误
- 抽象包装带有异常的 C 错误处理的最佳方法
- vwprintf错误处理(ERRNO显示0)
- C++ 使用枚举进行错误处理
- 在 C++ 中创建自己的错误处理机制