当我在特定状态下关闭我的应用时,此代码会运行:
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>
提前致谢
答案 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);
}