在嵌套循环中从向量中删除时的Segfault

时间:2016-12-02 20:41:58

标签: c++ vector stl iterator erase

这是我正在运行的代码:

for(auto candidate = candidates.begin(); candidate != candidates.end();) {
    for(auto inst = candidate->sortedLoads.begin(); inst != candidate->sortedLoads.end(); inst++) {
        if(...) {
            candidate = candidates.erase(candidate);
            break;
        }

        else {
            candidate++;
        }
    }        
}

用上面的方法进入段错误。如果我删除内部for循环,则segfault会消失。你们知道什么是错的吗?

2 个答案:

答案 0 :(得分:0)

修改
您从内循环中的外循环中递增candidate变量,没有任何东西阻止他超过其上限candidate != candidates.end()。至少将这个条件添加到内循环中。你最终会得到:

for(auto candidate = candidates.begin(); candidate != candidates.end();) {
    for(auto inst = candidate->sortedLoads.begin(); candidate != candidates.end() && inst != candidate->sortedLoads.end() ; inst++) {
        if(...) {
            candidate = candidates.erase(candidate);
            break;
        }

        else {
            candidate++;
        }
    }
}

但总的来说,如果你在另一个循环内增加/减少(或改变值的任何操作)循环变量,你需要在第二个循环中重复第一个循环条件(变量来自哪里)(其中& #39;被改变了!)

答案 1 :(得分:0)

问题1:

inst = candidate->sortedLoads.begin();

instcandidate内部内容的迭代器。如果candidate被删除,那么inst会引用什么?没人知道。

问题2:假设您只是递增candidate而且inst仍然是有效参考。

inst != candidate->sortedLoads.end()

inst引用第一个sortedLoads的{​​{1}}中的条目,并与另一个candidateend的{​​{1}}进行比较}。在出现不良之前几乎肯定不会满足退出条件。

问题3:J.Baoby已经介绍过:没有测试在内循环中超过sortedLoads s的结尾。

在这个问题上,不要为你提供一个好的解决方案。建议尝试解析candidatecandidate之间的逻辑。