map/set erase iterator超出范围

pig*_*d10 0 c++ map sfml

当我在特定状态下关闭我的应用程序时,此代码运行:

void GameEndState::exit(){
    delete m_pGameObjectManager;
    delete m_pSceneManager;
}
Run Code Online (Sandbox Code Playgroud)

运行m_pGameObjectManager的析构函数后,它是:

GameObjectManager::~GameObjectManager(){
    std::for_each(gameObjects.begin(),gameObjects.end(),GameObjectDeallocator());
}
//gameObjects is a std::map<sf::String,VisibleGameObject*>

///////////////

struct GameObjectDeallocator{
        void operator()(const std::pair<sf::String,VisibleGameObject*>&p) const{
            delete p.second;
        }
    };
Run Code Online (Sandbox Code Playgroud)

它会产生标题的错误.我没有从谷歌上找到任何这个错误的结果.我正在使用SFML 2.0.

VisibleGameObject的析构函数:

VisibleGameObject::~VisibleGameObject(){
    m_pSceneManager->removeSprite(name);
}

void SceneManager::removeSprite(sf::String spritename){
    std::cout << "removed " << std::string(spritename) << std::endl;
    sprites.erase(sprites.find(spritename));
}

//sprites is a std::map<sf::String,sf::Sprite>
Run Code Online (Sandbox Code Playgroud)

提前致谢

Mar*_*som 5

错误就在这一行,显然sprites.find没有找到你给它的名字并且正在返回sprites.end().

sprites.erase(sprites.find(spritename));
Run Code Online (Sandbox Code Playgroud)