gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:20:25 25 4
gpt4 key购买 nike

归根结底,为什么迭代器会导致段错误?请注意,我在这里键入我代码的相关部分,而不是复制粘贴。如果编译有错误,请注意,但不要认为这是我问题的根源。

在我的代码中,我有一张珠子盒子图:
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
.
.
.
}
}
}
}

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

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

    0 0x00002aaaaab43c65 in std::_Rb_tree_increment(std::_Rb_tree_node_base*) () 来自/usr/lib64/libstdc++.so.61 0x000000000041a28e in operator++ (this=0x63d7c0) 在/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/STL_tree .h:265

我会很感激任何帮助,谢谢。

编辑:解决了,有点

为了将错误减少到最少的运行示例,我删除了所有这些行并重写了它们,现在一切正常。不过,我仍然对这种情况感兴趣:

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

最佳答案

以唯一可能的方式回答您的编辑:

If you want, I can reask the question: When will iterator incremental cause a segmentation fault in c++?

递增迭代器只有在使用不当的情况下才会导致段错误。

就是这样。

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

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

  • 迭代器已经指向集合的末尾,或者
  • 迭代器指向集合外,指向一个超出范围的变量,或者迭代器可能根本没有被初始化。

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

关于c++ - 为什么设置迭代器指针会导致段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7516158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com