【发布时间】:2020-02-09 06:17:47
【问题描述】:
在某些时候,我的大项目的代码开始出现 segmentation fault 运行时错误,并带有这样的堆栈跟踪:
0# std::basic_ios >::widen (__c=10 '\n', this=) at /usr/include/c++/7/bits/basic_ios.h:450
1# std::endl > (__os=...) at /usr/include/c++/7/ostream:591
2# std::ostream::operator 3# main() at segfault.cpp:11
last (3#) 总是指向 std::cout 行,例如 std::cout << "hello" << std::endl;
所以我把我的代码简化为这个最小的结构,它仍然会导致同样的错误:
#pragma pack(1)
struct Point {
int x;
};
#include <iostream>
int main()
{
for(;;){
std::cout << "hello" << std::endl;
}
}
这是使用g++ -std=c++17 segfault.cpp -o segfault -g -Ofast 命令构建的。
执行任何以下操作将取消错误:
- 删除
#pragma pack(1) - 从 g++ 选项中删除
-Ofast - 删除
for(;;){(将std::cout ...移出循环) - 在
#pragma pack(1)之前移动#include <iostream>
尝试使用 g++ 7.4.0 和 g++ 9.2.1 构建(结果相同)。
【问题讨论】:
标签: c++ g++ cout pragma pragma-pack