map / set erase iterator超出范围

时间:2012-02-24 17:55:17

标签: c++ map sfml

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

void GameEndState::exit(){
    delete m_pGameObjectManager;
    delete m_pSceneManager;
}

运行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;
        }
    };

它会产生标题的错误。我没有从谷歌上找到任何这个错误的结果。我正在使用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>

提前致谢

2 个答案:

答案 0 :(得分:5)

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

sprites.erase(sprites.find(spritename));

答案 1 :(得分:1)

你可以简单地用一个键调用erase,不需要将迭代器传递给它(除非你使用的是多图,我认为不是这样):sprites.erase(spritename);这个代码仍然不是很好,因为它可能会尝试擦除不存在的元素。所以你最好去:

std::map<sf::String,sf::Sprite>::iterator iter = sprites.find(spritename);
if (iter != sprites.end()) {
  sprites.erase(iter);
}