【问题标题】:Segfault when erasing from vector while in nested loops在嵌套循环中从向量中擦除时出现段错误
【发布时间】:2017-04-17 20:30:24
【问题描述】:

这是我正在运行的代码:

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

【问题讨论】:

    标签: c++ vector stl iterator erase


    【解决方案1】:

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

    但一般来说,如果您要在另一个循环中增加/减少(或任何改变值的操作)循环变量,您需要在第二个循环中重复第一个循环条件(变量来自哪里)(它在哪里)正在改变)!

    【讨论】:

    • 是的,当我盯着确保格式正确时才意识到这一点。谢谢!
    • 真正接近,但当candidate 从其下方更改时缺少inst 的更改。
    • 好点,我省略了最后的简化。在这种情况下是不正确的。我也在内部循环中切换了条件。谢谢@user4581301。 Prasanna UV 你必须小心
    【解决方案2】:

    问题一:

    inst = candidate->sortedLoads.begin();
    

    instcandidate 内部的迭代器。如果candidate 被删除,inst 指的是什么?没人知道。

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

    inst != candidate->sortedLoads.end()
    

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

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

    在这个问题上没有适合您的解决方案。建议尝试解开 instcandidate 之间的逻辑。

    【讨论】:

    • 即使我在擦除()上从内部循环中断,问题 1 是否也是一个问题?问题 2 和 3 是逻辑缺陷,同意。
    • @PrasannaUV 我错过了break。你应该有那个节拍。
    • 您可以通过在增加candidate 时添加额外的break 来解决问题2。但这将意味着你的内部循环将毫无意义......一个 if-else 结构,在这两种情况下循环都被打破了! => 不需要内部循环
    猜你喜欢
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    相关资源
    最近更新 更多