2012-02-24 3 views
0

,이 코드를 실행합니다지도 설정/삭제 반복자는

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

이 생성됩니다

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

입니다 m_pGameObjectManager의 소멸자를 실행 한 후 제목의 오류. Google 검색에서이 오류의 결과를 찾지 못했습니다. 나는 SFML 2.0을 사용하고있다.

VisibleGameObject의 소멸자 : 사전

+2

나는 당신이 제공 한 코드 조각에 의해 생성 된 것이라고 생각하지 않습니다. 여기에 미리보기에서지도 지우기가 표시되지 않습니다. VisibleGameObject 란 무엇입니까? 소멸자가 지우를 호출하는 것일까 요? –

+0

죄송합니다. 나는 그들을 포함시킬 의도였습니다. 편집 : – pighead10

답변

5

오류이 줄에있는

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> 

감사합니다, 분명히 sprites.find 당신이 그것을 준 이름을 찾는되지 않고 sprites.end()을 반환합니다.

sprites.erase(sprites.find(spritename)); 
(당신은 내가 그렇지 않은 생각 multimap은 사용하지 않는 경우)
+0

아, 간단했습니다. 전에 gameobjectmnager의 소멸자를보고있었습니다! 감사 – pighead10

1

당신은 단순히 키를 삭제 요청할 수있다, 필요가에 반복자를 통과하지 않으려면 : sprites.erase(spritename); 아직도이 코드가 매우 좋지 않다을 존재하지 않는 요소를 삭제하려고 시도 할 수 있습니다. 그럼 당신은 더 나은 곳으로 가야합니다 :

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