在嵌套循环中从向量中擦除时出现段错误
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:假设您只是增加了 candidate
而 inst
仍然是一个有效的引用。
inst != candidate->sortedLoads.end()
inst
指的是第一个 candidate
的 sortedLoads
中的一个条目,并与另一个 sortedLoads
中另一个 sortedLoads
的 end
进行比较13=]。在坏事发生之前,几乎肯定不会满足退出条件。
问题 3:J.Baoby 已经涵盖:没有测试在内循环中超过 candidate
s 的结束。
在这方面没有适合您的解决方案。建议尝试理清 inst
和 candidate
之间的逻辑。
这是我的代码 运行:
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:假设您只是增加了 candidate
而 inst
仍然是一个有效的引用。
inst != candidate->sortedLoads.end()
inst
指的是第一个 candidate
的 sortedLoads
中的一个条目,并与另一个 sortedLoads
中另一个 sortedLoads
的 end
进行比较13=]。在坏事发生之前,几乎肯定不会满足退出条件。
问题 3:J.Baoby 已经涵盖:没有测试在内循环中超过 candidate
s 的结束。
在这方面没有适合您的解决方案。建议尝试理清 inst
和 candidate
之间的逻辑。