这是我正在运行的代码:
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会消失。你们知道什么是错的吗?
答案 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();
inst
是candidate
内部内容的迭代器。如果candidate
被删除,那么inst
会引用什么?没人知道。
问题2:假设您只是递增candidate
而且inst
仍然是有效参考。
inst != candidate->sortedLoads.end()
inst
引用第一个sortedLoads
的{{1}}中的条目,并与另一个candidate
中end
的{{1}}进行比较}。在出现不良之前几乎肯定不会满足退出条件。
问题3:J.Baoby已经介绍过:没有测试在内循环中超过sortedLoads
s的结尾。
在这个问题上,不要为你提供一个好的解决方案。建议尝试解析candidate
和candidate
之间的逻辑。