遍历矢量(分段错误)

Going over a vector (Segmentation fault)

本文关键字:错误 分段 遍历      更新时间:2023-10-16

我怀疑迭代器有问题,但我不明白为什么!你能给我更多的信息吗?

我有以下电影课:

public:
    vector<string> casting() const;
private:
    string _titol;
    short _year;
    vector<string> _alies;
    string _director;
    vector<string> _casting;

casting()方法只返回_cast矢量

我有我的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错误。有人能看到这里发生了什么吗?

您的前提是错误的。casting()方法每次调用时都会返回_casting向量的新副本。因此it2永远不能等于it->second.casting().end(),因为它是一个完全不同容器的迭代器!

事实上,it2在完整表达式结束时立即失效,因为它是一个迭代器,进入一个立即死亡的临时容器。

如果casting()旨在提供实际_casting矢量的视图,则应返回左值:

const std::vector<std::string> & casting() const { return _casting; }
//                            ^^^

casting()函数通过值返回一个临时向量。对函数的不同调用每个都返回一个新的矢量副本。

所以当你写:

for(it2=it->second.casting().begin(); 

CCD_ 10立即悬空。

测试it2!=it->second.casting().end();将悬空迭代器与_casting的新副本的末尾进行比较,从而导致未定义的行为。

有两个选项可以解决此问题:

  1. 存储结果:vector<string> casting = it->second.casting(); for (it2 = casting.begin(); ..........
  2. 使casting()通过引用返回,以便处理it->second中向量的实际实例