首页 文章

将(共享指针的)向量的值分配给共享指针会导致分段错误c

提问于
浏览
1

在我的代码中,我有一个名为 foosBoxesvector <vector <vector <vector <std::tr1::shared_ptr<foo> > > > > . 嵌套向量具有模拟物理盒位置的作用 . 我也有一个导致分段错误的while循环:

vector<std::tr1::shared_ptr<foo> >::iterator fooit = foosBoxes[x][y][z].begin(); //x,y,z are valid integer
std::tr1::shared_ptr<foo> aFoo;
while (fooit != foosBoxes[x][y][z].end()){
  aFoo = *fooit; //this cause segmentation fault
  fooit++;
  //some stuff which does not have an effect on fooit;
}

我试过的一些事情:
1.我试图使用 aFoo = *fooit++ ,但这不起作用 .
分段故障大致发生在千分之几循环之后 .
我试图解决这个问题,而valgrind经历了这个步骤 .
在崩溃的循环中,我在可疑线路之前和之后打印了一个运行计数器 . 在线之前,我得到8次打印(矢量的大小),然后我得到7次打印 .

我怎么能搞清楚这一点?

Update:
我在主循环之前添加了一个循环运行:

int kkk = 1214
int c = 0;
while (c < foosBoxes[x][y][z].end()){
   aFoo = foosBoxes[x][y][z][c++];
   printf("%i\t, kkk);
   fflush(stdout);
}

这产生相同的结果 .

Update:
根据gdb:

程序接收信号SIGSEGV,分段故障 . 旋转中的0x000000000043e400(kkk = 1214)位于/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c /4.1.2/tr1/boost_shared_ptr . h:153 153 dispose();

我认为boost_shared_ptr.h中的相应函数是

void
  release() // nothrow                                                                                                                      
  {
    if (__gnu_cxx::__exchange_and_add(&_M_use_count, -1) == 1)
      {
        dispose(); //this is line 153
#ifdef __GTHREADS
        _GLIBCXX_READ_MEM_BARRIER;
        _GLIBCXX_WRITE_MEM_BARRIER;
#endif
        if (__gnu_cxx::__exchange_and_add(&_M_weak_count, -1) == 1)
          destroy();
      }
  }

dispose() 在文件的其他位置定义:

// dispose() is called when _M_use_count drops to zero, to release                                                                        
  // the resources managed by *this.                                                                                                        
  virtual void
  dispose() = 0; // nothrow

可能是因为对shared_ptr进行了错误的管理,我应该切换回常规指针?

Update:
另一个测试结果相似:

int kkk = 1214 int c = fooBoxes [x] [y] [z] .size(); while(c> = 0){aFoo = foosBoxes [x] [y] [z] [c--]; printf(“%i \ t,kkk”; fflush(stdout);}

这次程序在第三次迭代中粉碎 . 如果问题是错误的分配,那么程序应该在第一次迭代中进行压缩(在第一次迭代中程序崩溃的相反方向) .

5 回答

  • 0

    要对 foosBoxes[x][y][z] 的元素进行操作,您还可以尝试:

    while (fooit != foosBoxes[x][y][z].end()){
          vector<std::tr1::shared_ptr<foo> > *aFoo = *fooit; 
           fooit++;
          //To use the object 
         // use it as   aFoo->method()  
     }
    

    不确定我是否明白这一点 . 但我目前正在使用指针来迭代我的对象 .

  • 0
    //some stuff which does not have an effect on fooit;
    

    但这些东西对foosBoxes [x] [y] [z]有什么影响吗?特别是它删除元素或导致向量重定位?如果是这样,fooit无法与foosBoxes [x] [y] [z] .end()进行有意义的比较 .

    另外,循环中的aFoo会发生什么?如果这得到一个无效值,稍后对它的赋值将导致未定义的行为 .

    尝试从循环中删除 some stuff . 如果这有效,那么东西就包含了一个bug . 如果循环仍然失败,则在进入循环之前,原因必须是fooxBoxes []中的无效值

    我没有使用ValGrind的经验 . 但我使用过类似的产品 . 请检查您是否已将ValGrind配置为最严格的设置 . 这可能会使得使用它非常缓慢,但希望找到错误 .

  • 0

    debug mode中使用libstdc运行代码 . 它将对迭代器,容器和算法进行额外检查,并希望有助于找到错误 .

  • 1

    我得出结论,问题是使用 vector 是错误的,因为我通过代码更新它 . 我不知道 c++ 中的内存管理是如何工作的,但我相信两个向量之间发生了某种重叠 . 我已切换到 set ,现在一切正常

  • -1

    你是代码,因为它看起来没问题,我唯一能想到的是 x y z 有效吗? operator[] 没有边界检查......

相关问题