1

考虑以下:

for (it = list.begin(); it != list.end(); ++it) {
    if (!(*it)->alive) {
        it = list.erase(it);
    }
}

只要list.size() > 1. 一旦列表只包含一个元素,就会调用擦除段错误。我假设是因为没有下一个元素。至少,这是我观察到的行为。有没有正确的方法来处理这个?也许是完全不同的方法?

如您所见,我不想立即清除列表。我只想在元素死亡时删除它们,这可以正常工作,直到它删除最后一个元素。

4

1 回答 1

10

以下将正常工作:

for (it = list.begin(); it != list.end(); ) {
    if (!(*it)->alive) {
        it = list.erase(it);
    } else {
        ++it;
    }
}

问题不仅在于某些尺寸。在您的示例中,每次删除一个元素时都会跳过一个元素。想想看。

如果该元素不是“活动的”,那么您执行: it = list.erase(it);,它会删除该元素并设置it为它后面的元素。然后你的循环执行++it,它会跳过下一个,可能会跳过end()

这不仅仅是 skipping 的问题end(),你也跳过了其他人,但删除列表中的最后一个元素可能会导致崩溃。

于 2011-06-21T19:41:38.260 回答