C++ Map 在尝试设置值时出现总线错误

标签 c++ data-structures

我有以下函数作为类的构造函数:

template<typename T>
void Pointer<T>::Pointer(T* inPtr)
{
  mPtr = inPtr;
  if (sRefCountMap.find(mPtr) == sRefCountMap.end()) {  
    sRefCountMap[mPtr] = 1;
  } else {
    sRefCountMap[mPtr]++;
  }
}

这是 map 的定义:

static std::map<T*, int> sRefCountMap;

运行此代码时有时会出现总线错误:

#0  0x95110fc0 in std::_Rb_tree_decrement ()
#1  0x00017ccc in std::_Rb_tree_iterator<std::pair<Language::Value* const, int> >::operator-- (this=0xbfffe014) at stl_tree.h:196
#2  0x0001b16c in std::_Rb_tree<Language::Value*, std::pair<Language::Value* const, int>, std::_Select1st<std::pair<Language::Value* const, int> >, std::less<Language::Value*>, std::allocator<std::pair<Language::Value* const, int> > >::insert_unique (this=0x2a404, __v=@0xbfffe14c) at stl_tree.h:885
#3  0x0001b39c in std::_Rb_tree<Language::Value*, std::pair<Language::Value* const, int>, std::_Select1st<std::pair<Language::Value* const, int> >, std::less<Language::Value*>, std::allocator<std::pair<Language::Value* const, int> > >::insert_unique (this=0x2a404, __position={_M_node = 0x2a408}, __v=@0xbfffe14c) at stl_tree.h:905
#4  0x0001b5a0 in __gnu_norm::map<Language::Value*, int, std::less<Language::Value*>, std::allocator<std::pair<Language::Value* const, int> > >::insert (this=0x2a404, position={_M_node = 0x2a408}, __x=@0xbfffe14c) at stl_map.h:384
#5  0x0001b6e0 in __gnu_norm::map<Language::Value*, int, std::less<Language::Value*>, std::allocator<std::pair<Language::Value* const, int> > >::operator[] (this=0x2a404, __k=@0x2e110) at stl_map.h:339

谢谢。

最佳答案

根据您的评论,您说您正在初始化静态 Pointer。这很可能意味着您遇到了“静态初始化顺序惨败”——如果两个静态对象在不同的​​编译单元中,那么它们的初始化顺序没有定义。所以如果一个的构造函数依赖于另一个已经存在初始化,那么你可能会侥幸逃脱,也可能不会。 Sod 定律规定代码在测试期间可以正常工作,然后在部署时神秘地崩溃。

最好的解决办法是避免静态对象;他们很少是个好主意。

另一种可能性是惰性实例化,像这样:

typedef std::map<T*, int> RefCountMap;

static RefCountMap& GetRefCountMap()
{
    static RefCountMap map;
    return map;
}

这可能有它自己的问题;它保证在使用之前构造,但如果静态析构函数访问它,它可能会在您完成之前被销毁,并且可能存在线程安全问题。有关详细信息,请参阅有关 Singleton 模式的许多讨论,它需要一个静态实例。 C++ 中的单例是一个充满痛苦的世界,最好尽可能避免。

关于C++ Map 在尝试设置值时出现总线错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3141572/

相关文章:

c++ - 关于具有不同内容的文件拷贝的 Visual Studio 警告

java - java中的多维数据结构

需要 MySQL 数据库结构建议。从一个表到另外两个表的两个多对多,它们处于一对多关系

java - 模式的字符串匹配

C++ ASM Inline如何在ASM中使用struct成员?

c++ - 在函数中使用 throw 关键字会产生 gcc 警告

C++ 事件(焦点)处理

c++ - RTTI 支持 C++11(_CPPRTTI 和 __GNUG__)

c++ - 一种在再次打开文件之前知道文件当前是否打开的方法?

swift - 如何在类外设置结构值?