在pragma pack中包含std map会导致崩溃

时间:2018-01-15 08:07:20

标签: c++ dictionary include pragma

我想知道为什么在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));

1 个答案:

答案 0 :(得分:1)

标准库不是标题库。某些部分编译为libstdc++.so.6。因此,有二进制代码需要标准库容器上的一些二进制布局。例如,_Rb_tree_node::_Rb_tree_increment已编译。

通过执行pragma pack(1),您正在更改_Rb_tree_node的二进制布局,以便在std::map元素上进行迭代。

因此,使std::map紧密打包需要libstdc++重新编译