2017-07-21 2 views
0

Je suis nouveau en C++, désolé si c'est une question fictive. J'essaie de créer une méthode qui supprimerait un pointeur donné d'un vecteur et supprimerait son objet. Voici ce que j'ai en ce moment:Supprimer un objet spécifique de la liste des vecteurs

void Engine::destroyObject(GameObject* obj) { 

    if (obj == nullptr) { 
     std::cout << "Error: GameObject pointer given is null!" << std::endl; 
     return; 
    } 
    else if (m_GameObjects.empty()) { 
     std::cout << "Error: Trying to destroy GameObject while list is empty!" << std::endl; 
     return; 
    } 

    auto it = std::remove(m_GameObjects.begin(), m_GameObjects.end(), obj); 
    if (it != m_GameObjects.end()) { 
     delete obj; 
     m_GameObjects.erase(it, m_GameObjects.end()); 
    } 
} 

GameObject* Engine::findObject(std::string name) { 
    return *std::find_if(m_GameObjects.begin(), m_GameObjects.end(), [name](GameObject* e) { return e->getName() == name; }); 
} 

J'appelle ces méthodes comme celle-ci:

GameObject* obj = findObject("Random"); 
destroyObject(obj); 

Mais pour une raison quelconque, plantage de mon programme à m_GameObjects.erase(it, m_GameObjects.end()); avec l'erreur « vecteur iterator pas dereferencable »

J'ai essayé de changer la ligne à it = m_GameObjects.erase(it, m_GameObjects.end()); mais cela n'a rien changé.

Merci d'avance!

Edit: Voici un peu plus d'info gameobject est juste une classe régulière (avec certaines données telles que le nom ...) La méthode findProject fonctionne très bien, il est la ligne d'effacement qui est à l'origine d'une erreur.

+0

Impossible de reproduire: http://coliru.stacked-crooked.com/a/98a14577189a140f S'il vous plaît modifier votre question pour contenir un [mcve], qui ressemblerait à quelque chose comme ce lien, mais contient le code réellement nécessaire pour obtenir le même erreur que vous faites. – aschepler

+5

Peut-être non apparenté, mais votre fonction 'findObject' a un comportement indéfini si aucun objet du vecteur n'a le nom demandé. – aschepler

+0

Le moteur doit-il être impliqué? Si vous utilisez 'boost :: shared_ptr', the_vector.erase (it) appellera le destructeur d'objet. – lakeweb

Répondre

0

Donc aschepler J'ai découvert que ma fonction findObject ne vérifiait pas les valeurs nulles (si l'objet n'existait pas/n'a pas pu être trouvé) alors j'ai ajouté quelques vérifications et cela fonctionne maintenant. Merci beaucoup! J'ai ensuite dû vérifier si la valeur était nullptr et ne pas faire quoi que ce soit si oui.