c++ - 将(共享指针的) vector 的值分配给共享指针导致段错误c++

标签 c++ segmentation-fault while-loop shared-ptr

在我的代码中,我有一个 vector <vector <vector <vector <std::tr1::shared_ptr<foo> > > > >名为 foosBoxes .嵌套 vector 具有模拟物理框位置的作用。我还有一个导致段错误的 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++但这没有用。
2. segmentation fault 大概在几千次循环后出现,正常。
3. 我尝试用 valgrind 解决这个问题,valgrind 完成了这个步骤。
4. 在崩溃的循环中,我在可疑行前后打印了一个运行计数器。在行之前,我得到 8 个打印( vector 的大小),在我得到 7 个打印之后。

我该如何解决这个问题?

更新:
我在主循环之前添加了一个循环:

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);
}

这会产生相同的结果。

更新:
根据 gdb:

Program received signal SIGSEGV, Segmentation fault. 0x000000000043e400 in rotate (kkk=1214) at /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 管理不善的原因,我应该切换回常规指针?

更新:
另一个结果相似的测试:

int kkk = 1214 int c = fooBoxes[x][y][z].size(); 而 (c >= 0){ aFoo = foosBoxes[x][y][z][c--]; printf("%i\t, kkk); fflush(标准输出);

这次是程序crush在第三次迭代。如果问题出在错误的分配上,那么程序应该在第一次迭代中崩溃(在相反的方向上程序在第一次迭代中崩溃)。

最佳答案

debug mode 中使用 libstdc++ 运行您的代码.它将对迭代器、容器和算法进行额外检查,希望能帮助找到错误。

关于c++ - 将(共享指针的) vector 的值分配给共享指针导致段错误c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7090367/

相关文章:

c++ - 生成字典排列 : Segmentation fault

c++ - 打开 g++ 优化会导致段错误 - 我不明白

java - 哨兵控制循环以及如何打印多个字符串。初学者java编程

php - 如何将 AJAX 处理合并到 PHP/MySQL While 循环(用于异步编辑)中?

c++ - 数字生成 C++

C 内存管理 -> 队列

c++ - 为什么 std::bitset::size 是非静态的

c - 循环迭代的次数与输入中的字符数相同

c++ - std::array 类成员在编译时设置?

c++ - 如何确定要为boost::stacktrace::safe_dump分配多少空间?