请考虑以下事项:
for (it = list.begin(); it != list.end(); ++it) {
if (!(*it)->alive) {
it = list.erase(it);
}
}
只要list.size() > 1
,这就可以正常工作。一旦列表只包含一个元素,则调用erase segfaults。我假设因为没有下一个元素。至少,这是我观察到的行为。
有没有正确的方法来处理这个?也许是一种完全不同的方法?
如您所见,我不想立即清除列表。我想在它们死亡时删除元素,这样可以正常工作,直到它删除最后一个元素。
答案 0 :(得分:10)
以下内容将正常运行:
for (it = list.begin(); it != list.end(); ) {
if (!(*it)->alive) {
it = list.erase(it);
} else {
++it;
}
}
问题不仅在于某些尺寸。在您的示例中,每次删除元素时,您都跳过元素。想一想。
如果元素不是“活着”,那么你执行:it = list.erase(it);
,删除元素并将it
设置为跟随它的那个元素。 然后你的循环执行++it
,跳过下一个,可能会跳过end()
!
这不仅仅是跳过end()
的问题,您也在跳过其他人,但删除列表中的最后一个元素可能会导致崩溃。