【问题标题】:#pragma pack(1) causes segmentation fault#pragma pack(1) 导致分段错误
【发布时间】: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 &lt;iostream&gt;

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

【问题讨论】:

    标签: c++ g++ cout pragma pragma-pack


    【解决方案1】:
    #pragma pack(1)
    // ...
    #include <iostream>
    

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

    【讨论】:

    • 谢谢,不知道#pragma pack(1) 适用于所有其他声明 - 只考虑声明一个。用#pragma pack(push,1) / #pragma pack(pop) 修复它
    猜你喜欢
    • 2016-04-28
    • 2016-05-17
    • 1970-01-01
    • 2011-11-06
    • 2020-12-31
    • 2019-07-21
    • 2018-07-28
    • 2014-04-25
    • 2011-07-18
    相关资源
    最近更新 更多