我认为迭代器存在问题,但我不明白为什么! 你能告诉我更多信息吗?
我有以下电影课:
public:
vector<string> casting() const;
private:
string _titol;
short _year;
vector<string> _alies;
string _director;
vector<string> _casting;
casting()
方法只返回_casting vector
我有我的main.cpp,我打电话:
void Movies::actorMovies(string actor){
bool existeix = false;
std::map<titleyear,Movie>::iterator it = _pelis.begin();
std::vector<string>::iterator it2;
for(it; it!=_pelis.end(); it++){
for(it2=it->second.casting().begin(); it2!=it->second.casting().end(); it2++){
/*if((*it2).compare(actor)==0){
cout<<"Titol: "<<it->first.t<<endl<<"Any: "<<it->first.y<<endl;
existeix = true;
}*/
}
}
if(!existeix)
cout<<"NOT FOUND"<<endl;
}
当我想要取消注释if语句时出现Segmentation故障。 有人能看到这里发生了什么吗?
答案 0 :(得分:5)
你的前提是错的。每次调用casting()
方法时,_casting
方法都会返回 it2
向量的新副本。因此it->second.casting().end()
永远不能等于it2
,因为它是一个完全不同的容器的迭代器!
实际上,casting()
在完整表达式结束时立即失效,因为它是一个立即死亡的临时容器的迭代器。
如果_casting
旨在提供实际const std::vector<std::string> & casting() const { return _casting; }
// ^^^
向量的视图,则应返回左值:
...setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
答案 1 :(得分:3)
casting()
函数按值返回临时向量 。对函数的不同调用都会返回向量的新副本。
所以当你写:
for(it2=it->second.casting().begin();
it2
立即悬空,因为临时矢量现在被破坏了。
测试it2!=it->second.casting().end();
将悬空迭代器与_casting
的新副本的结尾进行比较,从而导致未定义的行为。
有两种方法可以解决这个问题:
vector<string> casting = it->second.casting(); for (it2 = casting.begin(); ..........
casting()
,以便您将在it->second
内处理向量的实际实例。