我正在尝试使用递归制作一个非常简单的过滤器,但是由于某种原因,我不断得到这些SEG错误。
#include <iostream>
#include <vector>
#include <math.h>
class FilterGeneric {
public:
std::vector<int> filter(std::vector<int>& v, std::vector<int>::iterator i); //set i=v.begin() in main
private:
virtual bool g(int x) =0;
std::vector<int> result;
};
std::vector<int> FilterGeneric::filter(std::vector<int>& v, std::vector<int>::iterator i) {
if (i==v.end()) {
return result;
} else {
if (g(*i)==true) {
result.push_back(*i);
i++;
return filter(v,i);
} else {
i++;
return filter(v,i);
}
}
}
class FilterOdd : public FilterGeneric {
private:
bool g(int x);
};
bool FilterOdd::g(int x) {
if ((x%2)!=0) {
return true;
} else {
return false;
}
}
class FilterNonPositive : public FilterGeneric {
private:
bool g(int x);
};
bool FilterNonPositive::g(int x) {
if (x<0) {
return true;
} else {
return false;
}
}
class FilterForTwoDigitPositive : public FilterGeneric {
private:
bool g(int x);
};
bool FilterForTwoDigitPositive::g(int x) {
if (x>=10) {
return true;
} else {
return false;
}
}
int main() {
std::vector<int> v;
std::vector<int>::iterator it=v.begin();
for (int i=0;i<20;i++) {
v.push_back(pow(-1,i)*i);
}
std::cout<<std::endl;
FilterNonPositive fnp;
FilterForTwoDigitPositive ftd;
FilterGeneric *f1=&fnp;
FilterGeneric *f2=&ftd;
std::vector<int> r1;
std::vector<int> r2;
r1=f1->filter(v,it);
for (it=r1.begin();it!=r1.end();it++) {
std::cout<<*it<<" ";
}
r2=f2->filter(v,it);
for (it=r2.begin();it!=r2.end();it++) {
std::cout<<*it<<" ";
}
}
错误在这里:
std::vector<int> v;
std::vector<int>::iterator it=v.begin();
for (int i=0;i<20;i++) {
v.push_back(pow(-1,i)*i); // invalidates all iterators into "v"
}
...
r1=f1->filter(v,it); // using invalidated "it"
问题在于,如果需要调整向量大小,则v.push_back()
无效所有迭代器都进入向量。从文档:
如果新的size()大于容量(),则所有迭代器和参考(包括过去的迭代器)都是无效的。否则,只有过去的迭代器被无效。
通过移动it
初始化在v
进行了核对之后,也有其他错误。
如果您使用g++
构建,则可以使用-D_GLIBCXX_DEBUG
来帮助您找到此类错误。