底线,为什么迭代器会导致分段错误? 注意,我在这里输入我的代码的相关部分而不是复制粘贴。如果编译中有错误,请注意,但不要将其视为我的问题的来源。
在我的代码中,我有一个珠子盒子的地图:
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;
}
我使用一种非常简单的方法将珠子穿过盒子
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]);
}
在代码的其他地方,珠子的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
.
.
.
}
}
}
}
出于某种原因,我遇到了分段错误。到目前为止我得到的是:
这是来自gdb的outPut错误:
来自/usr/lib64/libstdc++.so.6的std :: _ Rb_tree_increment(std :: _ Rb_tree_node_base *)()中的<0x> 0 0x00002aaaaab43c65 运算符++中的0x000000000041a28e(this = 0x63d7c0)位于/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_tree .H:265感谢您的帮助,谢谢。
修改 解决了,有点。
尝试将错误减少到最小运行示例,我删除了所有这些行并重写它们,现在看起来很好。我仍然对这种情况感兴趣:
如果你愿意,我可以重新提出问题: 迭代器增量何时会在c ++中导致分段错误?
答案 0 :(得分:5)
尽可能回答您的编辑:
如果你愿意,我可以重新提出问题:迭代器增量什么时候会导致c ++出现分段错误?
只有在使用不正确的情况下,增加迭代器才会导致分段错误。
就是这样。
标准没有列出代码必须是段错误的情况,它只列出了使用正确代码时应该发生的情况。当您使用不正确时,它只是未定义的行为,并且可能发生任何一百万件事情,包括但不限于分段错误。
如果递增迭代器会给你一个段错误,那就是因为:
但是当您有未定义的行为时会发生分段错误。而且,根据定义,这使得无法告诉您哪些情况会触发分段错误。
答案 1 :(得分:3)
这些行中至少存在一个错误:
bit2 = beadsBoxes[t2].begin();
while (bit2 != nextBoxes[t2].end()){
shared_ptr<bead> b2 = *bit2++//the segmentation fault is here
假设beadsBoxes
和nextBoxes
是标准容器类型的对象,则错误地使用了迭代器。
bit2
似乎是一个指向beadsBoxes
成员的迭代器。但是,您将它与nextBoxes
的结尾进行比较。如果beadsBoxes[2]
和nextBoxes[2]
代表不同的对象,则无法执行此操作。
答案 2 :(得分:1)
你要解决的第一件事是getBox
。它不返回值,因此在调用时会发生未定义的行为。最后添加return out;
。