0

在某些时候,我的大项目的代码开始使用这样的堆栈跟踪出现分段错误运行时错误:

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<< (__pf=, this=) at /usr/include/c++/7/ostream:113
3# main () 在 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)
  • -Ofastg++选项中删除
  • 移除for(;;){std::cout ...移出循环)
  • 前移#include <iostream>_#pragma pack(1)

尝试使用g++ 7.4.0g++ 9.2.1构建(结果相同)。

4

1 回答 1

2
#pragma pack(1)
// ...
#include <iostream>

您已将#pragma pack 应用于您包含的标准库标头中的声明。您的可执行文件在运行时链接到的标准库可能没有应用编译指示。您的可执行文件与使用的运行时库不兼容。

于 2020-02-09T06:27:18.623 回答