2013-09-29 6 views
0

J'ai une classe Animaux, et à partir de ces animaux spécifiques sont dérivés. J'ai une liste d'animaux appelés mItems. Je veux voir si mes lions ont faim. J'ai créé des fonctions virtuelles dans ma classe Animaux:Le mystérieux Seg. Faute

virtual void IsLion() {return false;} 
    virtual void IsHungry() {return false;} 
    virtual void SetHungry(bool state) {} 

Dans ma classe de Lion J'ai étendu ces:

virtual void IsLion() {return true;} 
    virtual void IsHungry() {return mHungry;} 
    virtual void SetHungry() {mHungry = state;} 

mHungry est une variable membre booléen qui représente si oui ou non le lion a faim. MItems est une liste de pointeurs vers des objets CAnimal.

Si un Lion a faim, il est mort! Le problème que je suis est segfaults sans fin. Je ne peux pas identifier où je vais mal. J'ai une fonction qui est essentiellement équivalente à celle qui actualise périodiquement les lions d'avoir faim, alors j'appelle ça. Il semble que cela segmages lorsque j'essaie de supprimer les éléments de mItems. Des idées?

+1

Compilez avec -g et exécutez-le via un débogueur. – Sinkingpoint

+4

vous revenez pour les fonctions vides? – billz

+3

Supprimer des éléments d'une collection que vous itérez est un jeu dangereux – bengoesboom

Répondre

2

Une fois que vous avez supprimé l'élément de la liste, l'itérateur pointant vers cet élément n'est pas valide. Voir https://stackoverflow.com/a/3329962/1558890. L'appel i++ (ou ++i) sur un itérateur non valide est susceptible d'entraîner une erreur de segmentation.

+1

Peut-être utile de mentionner qu'il peut utiliser la valeur de retour de list :: erase pour garder son itérateur valide, ou casser et faire que la fonction supprime seulement le premier lion affamé. –