我有以下代码:
bool resetTypeBit = true;
for (auto it = eventsList.begin(); it != eventsList.end(); ++it) {
CreatureEvent* curEvent = *it;
if (curEvent == event) {
it = eventsList.erase(it);
} else if (curEvent->getEventType() == type) {
resetTypeBit = false;
}
}
所以我有以下情况:eventList
包含01项,然后,只要for
语句第一次通过并遇到it = eventsList.erase(it);
行,{ {1}}变量无效,导致it
语句的下一次迭代出现分段错误。
可能导致问题的任何线索?
答案 0 :(得分:5)
如果您删除的项目是列表中的最后一项,则content:attr(tooltip)
方法将返回erase
。然后,您的end()
循环将尝试递增该迭代器,从而导致未定义的行为。
你还没有遇到的另一个问题是,如果你删除的项目不是列表中的最后一项,你最终会跳过下面的项目(因为迭代器增加了超过一个for
返回)。您可以将erase
视为一个增量操作,恰好可以先擦除项目。
解决方案是稍微重构循环,将增量移动到结尾(仅当未调用erase
时):
erase
答案 1 :(得分:0)
正如现在编写的那样,即使在erase
分支中,也在递增迭代器,这意味着您总是在擦除元素之后跳过该元素。这是不正确的,如果最后一个元素恰好是要删除的元素,则会导致严重的问题。要修复,如果已经通过将it
设置为删除后的元素来修复bool resetTypeBit = true;
for (auto it = eventsList.begin(); it != eventsList.end(); ) {
CreatureEvent* curEvent = *it;
if (curEvent == event) {
it = eventsList.erase(it);
continue;
} else if (curEvent->getEventType() == type) {
resetTypeBit = false;
}
++it;
}
,则必须不增加。
layout_weight