2012-02-24 2 views
0

Когда я закрываю мое приложение в определенном состоянии, этот код работает:карты/набор Стирание итератора из диапазона

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

он будет производить ошибка заголовка. Я не нашел никаких результатов этой ошибки от googling. Я использую 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

Я не думаю, что ошибка возникает из фрагмента кода, который вы предоставили. Здесь я не вижу стирания карты. Что такое VisibleGameObject? Может быть, деструктор вызывает стирание? –

+0

К сожалению, я должен был включить их. Редактирование – pighead10

ответ

5

Ошибка в этой строке, по-видимому, sprites.find не находит имя, которое вы дали его и возвращается sprites.end().

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

О, это было просто. Раньше я только смотрел на деструктора gameobjectmnager! благодаря – pighead10

1

Вы можете просто вызвать стирание с ключом, нет необходимости передавать итератор к нему (если вы не используете Multimap который я думаю, это не так): sprites.erase(spritename); Тем не менее этот код не очень хорошо, как это может попытаться стереть несуществующий элемент. Так что вам лучше пойти на:

std::map<sf::String,sf::Sprite>::iterator iter = sprites.find(spritename); 
if (iter != sprites.end()) { 
    sprites.erase(iter); 
} 
Смежные вопросы