为什么设置迭代器指针会导致分段错误?

Yot*_*tam 1 c++ iterator set segmentation-fault

最重要的是,为什么迭代器会导致分段错误?注意,我在这里键入代码的相关部分而不是复制粘贴.如果编译中有错误,请注意,但不要将其视为我的问题的来源.

在我的代码中,我有一个珠子盒子的地图:
map<vector<int>,set<shared_ptr<bead> > > > nextBoxes;

除此之外,每个珠子还具有一个vec pos构件,该构件又具有:

  class vec{
  double x;
  double y;
  double z;
  .
  .
  .
  vector<int> getBox();
  .
  .
  .
}

vector<int> vec::getBox(){
  vector<int> out(3,0);
  extern double boxSize;
  out[0] = x/boxSize;
  out[1] = y/boxSize;
  out[2] = z/boxSize;
  return out;
}
Run Code Online (Sandbox Code Playgroud)

我用一种非常简单的方法将珠子穿过盒子

extern vectrot<shared_ptr<bead> > beads;
for (int i = 0; i < beads.size(); i++){
  vector<int> t = beads[i]->pos.getBox();
  nextBoxes[t].insert(beads[i]);
}
Run Code Online (Sandbox Code Playgroud)

在代码的其他地方,pos珠子的值可能会改变,我会在本地更新盒子.

我使用以下循环来浏览盒子和珠子:

map<vector<int>,set<shared_ptr<bead> > >::iterator mit = nextBoxes.begin();
extarn vector<vector<int> >::targets; //holds a vector of a 1, -1 and 0 vectors of distance from the box
extern int boxNum;
while (mit != nextBoxes.end()){
  vector<int> t1 = mit->second();
  set<shared_ptr<bead> >::iterator bit1 = mit->second.begin();
  set<shared_ptr<bead> >::iterator bit2;
  while (bit1 != mit->second.end()){ 
    shared_ptr<bead> b = *bit++;
    vector<int> t2(3,0);
    for (int i = 0; i < 13 i++){//13 is the size of the targets index.
      for (int j = 0; j < 3; j++){
        t2[j] = t1[j] + targets[i][j];
        if (t2[j] >= boxNum) t2[j] -= boxNum;
        if (t2[j] < 0 ) t2[j] += boxNum;
      }
      bit2 = beadsBoxes[t2].begin();
      while (bit2 != nextBoxes[t2].end()){
        shared_ptr<bead> b2 = *bit2++//the segmentation fault is here
        .
        .
        .
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我遇到了分段错误.到目前为止我得到的是:

  • 由于迭代器的增量,导致分段错误.
  • 盒子大小是2.
  • 这不是我测试的第一个盒子(没有计算它们,但它运行了一段时间).
  • 我完全不知道如何访问框中的第二个元素(第一个我可以使用迭代器,因为我没有增加它.
  • 这是来自gdb的outPut错误:

    0 0x00002aaaaab43c65 in std :: _ Rb_tree_increment(std :: _ Rb_tree_node_base*)()来自/usr/lib64/libstdc++.so.6 1 0x000000000041a28e in operator ++(this = 0x63d7c0)at/usr/lib/gcc/x86_64-redhat-linux/4.1.2 /../../../../包括/ C++/4.1.2 /比特/ stl_tree.h:265

我会感激任何帮助,谢谢.

编辑: 解决了,有点.

尝试将错误减少到最小运行示例,我已删除所有这些行并重写它们,现在事情看起来很好.我仍然对这种情况感兴趣:

如果你愿意,我可以重新提出问题: 迭代器增量什么时候会导致c ++中的分段错误?

jal*_*alf 5

尽可能回答您的编辑:

如果你愿意,我可以重新提出问题:迭代器增量什么时候会导致c ++中的分段错误?

增加迭代器只有在使用不正确时才会导致分段错误.

而已.

该标准没有列出代码必须是段错误的情况,它只列出了正确使用代码时应该发生的情况.当您错误地使用它时,它只是未定义的行为,并且可能发生任何一百万件事情,包括但不限于分段错误.

如果递增你的迭代器给你一个段错误,那要么是因为:

  • 迭代器已经指向集合的结尾,或者
  • 迭代器指向集合外部,超出范围的变量,或者迭代器从未被初始化.

但是当您有未定义的行为时会发生分段错误.而且,根据定义,这使得无法告诉您哪些情况会触发分段错误.