C++ 为什么集合迭代器指针会导致分段错误?

C++ 为什么集合迭代器指针会导致分段错误?,c++,iterator,segmentation-fault,set,C++,Iterator,Segmentation Fault,Set,说到底,迭代器为什么会导致分段错误? 注意,我在这里输入代码的相关部分,而不是复制粘贴。如果编译中有错误,请注意,但不要认为它是我的问题的来源。 在我的代码中,我有一张珠子盒的地图: map>nextbox 除其他外,每个胎圈都有一个vec pos成员,该成员依次具有: class vec{ double x; double y; double z; . . . vector<int> getBox(); . . . } vector&l

说到底,迭代器为什么会导致分段错误?
注意,我在这里输入代码的相关部分,而不是复制粘贴。如果编译中有错误,请注意,但不要认为它是我的问题的来源。 在我的代码中,我有一张珠子盒的地图:
map>nextbox

除其他外,每个胎圈都有一个
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;
}
由于某种原因,我得到了一个分割错误。到目前为止,我得到的是:

  • 分割错误是由于交互作用的增加造成的
  • 盒子的尺寸是2
  • 这不是我测试的第一个盒子(没有计算它们,但它运行了一段时间)
  • 我完全不知道如何访问框中的第二个元素(第一个元素我可以使用迭代器,因为我不增加它)
  • 这是来自gdb的输出错误:

    0 0x00002AAAAB43C65位于/usr/lib64/libstdc++.so.6中的标准:_Rb_tree_increment(标准:_Rb_tree_node_base*)() 在/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../../../../include/c++/4.1.2/bits/stl_tree.h:265处的operator++(this=0x63d7c0)中输入0x000000000041a28e

谢谢你的帮助

编辑: 算是解决了

为了尽量减少错误,我删除了所有这些行并重写了它们,现在一切看起来都很好。尽管如此,我仍然对这种情况感兴趣:

如果你愿意,我可以再问你一个问题:
迭代器增量何时导致C++中的分段错误?

:这些行中至少存在一个错误:

  bit2 = beadsBoxes[t2].begin();
  while (bit2 != nextBoxes[t2].end()){
    shared_ptr<bead> b2 = *bit2++//the segmentation fault is here
bit2=beadsboxs[t2].begin();
while(位2!=nextbox[t2].end()){
shared_ptr b2=*bit2++//分段错误在这里
假设
beadbox
nextbox
是标准容器类型的对象,则迭代器的使用不正确


bit2
似乎是一个迭代器,指向
beadbox
的成员。但是,您正在将其与
nextbox
的结尾进行比较。如果
beadbox[2]
nextbox[2]
表示不同的对象,则不能这样做。

这些行中至少存在一个错误:

  bit2 = beadsBoxes[t2].begin();
  while (bit2 != nextBoxes[t2].end()){
    shared_ptr<bead> b2 = *bit2++//the segmentation fault is here
bit2=beadsboxs[t2].begin();
while(位2!=nextbox[t2].end()){
shared_ptr b2=*bit2++//分段错误在这里
假设
beadbox
nextbox
是标准容器类型的对象,则迭代器的使用不正确


bit2
似乎是一个迭代器,指向
beadbox
的成员。但是,您正在将其与
nextbox
的末尾进行比较。如果
beadbox[2]
nextbox[2]
表示不同的对象,您不能这样做。

回答您的编辑,唯一可能的方法是:

<>如果你想,我可以重申一个问题:迭代器增量何时会导致C++中的分割错误?

仅当迭代器使用不正确时,递增迭代器将导致分段错误

就这样

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

如果递增迭代器会给您一个segfault,这是因为:

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

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

要回答您的编辑,唯一可能的方法是:

<>如果你想,我可以重申一个问题:迭代器增量何时会导致C++中的分割错误?

仅当迭代器使用不正确时,递增迭代器将导致分段错误

就这样

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

如果递增迭代器会给您一个segfault,这是因为:

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

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

您应该修复的第一件事是
getBox
。它不返回值,因此未定义的行为会在调用时发生。最后添加
返回;
你应该修复的第一件事是<代码> GETBox 。它不返回一个值,所以当它被调用时会发生未定义的行为。在结尾添加“代码>返回;”。

“如果编译中有错误,请注意,但不要认为它是我的问题的根源。”-如果您向我们展示的代码没有编译,我们无法猜测真正的问题是什么。我看不到
bit2
的声明,也看不到
beadsboxs
的声明,因此我真的无法说明指示行出现故障的原因。请将您的程序简化为仍然显示问题的最简单形式,然后复制粘贴到t编程到您的问题中。在减少程序的过程中,您可能会自己发现错误。有关此减少和粘贴技术的更多信息,以及为什么它很重要,请参阅。@jalf,其想法是这不是一个错误
  bit2 = beadsBoxes[t2].begin();
  while (bit2 != nextBoxes[t2].end()){
    shared_ptr<bead> b2 = *bit2++//the segmentation fault is here