C++ C++;试图设置值时,Map给出总线错误
我有以下函数作为类的构造函数:C++ C++;试图设置值时,Map给出总线错误,c++,data-structures,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]++; } } 模板 无效指针::指针(T*inPtr
template<typename T>
void Pointer<T>::Pointer(T* inPtr)
{
mPtr = inPtr;
if (sRefCountMap.find(mPtr) == sRefCountMap.end()) {
sRefCountMap[mPtr] = 1;
} else {
sRefCountMap[mPtr]++;
}
}
模板
无效指针::指针(T*inPtr)
{
mPtr=inPtr;
如果(sRefCountMap.find(mPtr)=sRefCountMap.end()){
sRefCountMap[mPtr]=1;
}否则{
sRefCountMap[mPtr]++;
}
}
以下是地图的定义:
static std::map<T*, int> sRefCountMap;
static std::map 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
#0 0x95110fc0标准:(Rb_树)减量()
#1 0x00017ccc位于stl_树上的std::_Rb_树迭代器::运算符--(this=0xbffe014)。h:196
#标准树中的2 0x0001b16c::_Rb_tree::在stl_tree中插入唯一的(this=0x2a404,_v=@0xbffe14c)。h:885
#3 0x0001b39c在std::_Rb_tree::在stl_tree插入_unique(this=0x2a404,_位置={u M_node=0x2a408},_v=@0xbfffe14c)。h:905
#4 0x0001b5a0位于stl_-gnu_-norm::map::insert(this=0x2a404,position={u-M_-node=0x2a408},uuu-x=@0xbffe14c)的stl_-map.h:384
#stl_map上的运算符[](this=0x2a404,_k=@0x2e110)中的5 0x0001b6e0。h:339
谢谢。您可能在程序的其他地方损坏了堆。通过内存调试器(如valgrind)运行您的程序,找出损坏发生的位置。从您的评论中,您可以说您正在初始化静态
指针。这很可能意味着您遇到了“静态初始化顺序的失败”——如果两个静态对象位于不同的编译单元中,则不确定它们的初始化顺序。因此,如果一个的构造函数依赖于另一个已经初始化的构造函数,那么您可能会侥幸逃脱,也可能不会。Sod定律规定代码在测试期间可以工作,然后在部署时神秘地中断
最好的解决办法是避免静止物体;它们很少是个好主意
另一种可能是延迟实例化,类似这样:
typedef std::map<T*, int> RefCountMap;
static RefCountMap& GetRefCountMap()
{
static RefCountMap map;
return map;
}
typedef std::map RefCountMap;
静态RefCountMap&GetRefCountMap()
{
静态参考计数图;
返回图;
}
这可能有它自己的问题;它保证在使用之前被构造,但是如果静态析构函数访问它,它可能会在使用完成之前被销毁,并且可能存在线程安全问题。关于血淋淋的细节,请参阅关于Singleton模式的许多讨论,它需要一个静态实例。C++中的单体是一个痛苦的世界,如果可能的话最好避免。如果它不存在,它将被初始化为0…您有任何指针的静态实例吗?它们可以在映射之前构造。这个程序是单线程的,还是几个不同的线程使用sRefCountMap?只是想知道我们是否可以排除线程错误。该错误似乎发生在初始化指针类的静态实例时。可能值得使用哈希映射std::unordered_map
或boost等价物,因为您不太关心顺序。Mike的答案更可能是因为您说它是静态指针。但是,当不涉及静态初始化时,标准库类或函数中的神秘崩溃几乎总是一个堆损坏问题。FWIW,这只是一个很好的全局变量,而不是单例(您不会阻止进一步创建RefCountMap
)。然而,我认为这种全局解决方案远远优于单例解决方案。