在嵌套循环中从向量中擦除时出现段错误

Segfault when erasing from vector while in nested loops

这是我的代码 运行:

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 循环,段错误就会消失。你们知道这是怎么回事吗?

编辑
您在内循环中从外循环递增 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++;
        }
    }
}

但一般来说,如果您要 increment/decrement(或任何更改值的操作)另一个循环内的循环变量,则需要在第二个循环中重复第一个循环条件(变量来自何处)循环(它被改变的地方)!

问题 1:

inst = candidate->sortedLoads.begin();

inst 是指向 candidate 中某物的迭代器。如果 candidate 被擦除,那么 inst 指的是什么?没人知道。

问题 2:假设您只是增加了 candidateinst 仍然是一个有效的引用。

inst != candidate->sortedLoads.end()

inst 指的是第一个 candidatesortedLoads 中的一个条目,并与另一个 sortedLoads 中另一个 sortedLoadsend 进行比较13=]。在坏事发生之前,几乎肯定不会满足退出条件。

问题 3:J.Baoby 已经涵盖:没有测试在内循环中超过 candidates 的结束。

在这方面没有适合您的解决方案。建议尝试理清 instcandidate 之间的逻辑。