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