Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;试图设置值时,Map给出总线错误_C++_Data Structures - Fatal编程技术网

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
)。然而,我认为这种全局解决方案远远优于单例解决方案。