越过矢量(分段故障)

时间:2015-11-30 02:16:30

标签: c++ vector std fault

我认为迭代器存在问题,但我不明白为什么! 你能告诉我更多信息吗?

我有以下电影课:

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故障。 有人能看到这里发生了什么吗?

2 个答案:

答案 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的新副本的结尾进行比较,从而导致未定义的行为。

有两种方法可以解决这个问题:

  1. 存储结果:vector<string> casting = it->second.casting(); for (it2 = casting.begin(); ..........
  2. 通过引用返回casting(),以便您将在it->second内处理向量的实际实例。
相关问题