我想知道为什么在pragma pack(1)中包含std映射会导致分段错误? std地图是否包含位字段?
seg错误发生在地图的第二个插入地址“std :: less :: operator().. atus/include/c++/5/bits/stl_function.h:387”,并且易于重现:
#pragma pack (1)
#include <map>
#pragma pack
using namespace std;
...
map<enum, pointerToClass>mapName
mapName.insert(pair<enum,pointerToClass>(enumValue, pointerToObject));
答案 0 :(得分:1)
标准库不是标题库。某些部分编译为libstdc++.so.6
。因此,有二进制代码需要标准库容器上的一些二进制布局。例如,_Rb_tree_node::_Rb_tree_increment
已编译。
通过执行pragma pack(1)
,您正在更改_Rb_tree_node
的二进制布局,以便在std::map
元素上进行迭代。
因此,使std::map
紧密打包需要libstdc++
重新编译