我有以下函数作为类的构造函数:
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/