尝试擦除列表的最后一个元素时出现此错误。我调试了代码并且能够找出导致它的原因和位置,这是我的代码:
for(Drop_List_t::iterator i = Drop_System.begin(); i != Drop_System.end() && !Drop_System_Disable; /**/)
{
if(Player->BoundingBox.Intersect(&(*i)->BoundingBox))
{
i = Drop_System.erase(i);
}
++i; //List iterator crashes here if last entry was deleted
}
我无法弄清楚我做错了什么......有什么建议吗?
答案 0 :(得分:14)
您的算法存在缺陷,因为您不了解erase
返回的内容。
使用erase
时,它会删除迭代器指向的元素,并将迭代器返回到下一个元素。
如果您希望迭代列表中的所有元素,则意味着每当使用erase
时,您都不应该进一步递增它。
这是你应该得到的普通代码:
if (Player->BoundingBox.Intersect(i->BoundingBox)) {
i = Drop_System.erase(i);
}
else {
++i;
}
这整齐地解决了你遇到的问题!因为当你erase
最后一个元素时,erase
将返回与end
相同的迭代器,这是一个指向最后一个元素的迭代器。此迭代器必须永不递增(如果列表不为空,则可能会递减)。
答案 1 :(得分:5)
您需要将++i
放入else
子句中。 erase
函数返回下一个有效的迭代器 - 然后你递增它,确保你不迭代每个元素。您应该只在您选择不擦除的情况下递增它。
答案 2 :(得分:4)
你想:
if(Player->BoundingBox.Intersect(&(*i)->BoundingBox))
{
i = Drop_System.erase(i);
}
else {
++i;
}