C++ vector iterator:erase()最后一项崩溃

use*_*734 2 c++ crash iterator erase

以下代码检查球是否与砖重叠.如果发生重叠,则会从列表中突出显示并删除砖块.

当我只删除矢量brickWall中的最后一项时,我遇到了核心转储.在评论erase()行时,代码似乎运行良好.
在论坛上查看类似问题之后,我相信我正在迭代并正确地删除向量中的项目,但我怀疑情况可能并非如此.

对此代码的任何建议将不胜感激!

void Game::updateEntities()
{
    ballMother.update();
    for (std::vector<gdf::Entity>::iterator it = brickWall.begin(); it != brickWall.end(); ++it) 
    {
        if (it->getRect().intersects(ballMother.getRect())) {
            it->rect.setFillColor(sf::Color::Red);
            it = brickWall.erase(it);
        }
        else {
            it->rect.setFillColor(it->colour);                
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

K-b*_*llo 11

通常的习语是

for (std::vector<gdf::Entity>::iterator it = brickWall.begin(); it != brickWall.end(); /*note nothing here*/) 
{
    if (it->getRect().intersects(ballMother.getRect())) {
        it->rect.setFillColor(sf::Color::Red);
        it = brickWall.erase(it);
    }
    else {
        it->rect.setFillColor(it->colour);                
        ++it;
    }
}
Run Code Online (Sandbox Code Playgroud)

否则你将跳过元素,并最终通过结束崩溃.