7
votes

C ++ Segmentation Lorsque vous utilisez Effacer sur STD :: Liste

J'essaie de supprimer des éléments d'une liste liée C ++ à l'aide de Effacer code> et une liste Itérateur: xxx pré>

i obtenir cette sortie et ne peut pas sembler Tracer la raison: P>

added item #0
added item #1
added item #2
added item #3
added item #4
added item #5
added item #6
added item #7
added item #8
added item #9
round #0
round #1
Segmentation fault


0 commentaires

4 Réponses :


24
votes

Le problème de base Voici vous utilisez à la valeur Iterator, IT , après avoir appelé effacer dessus. La méthode invalide l'itérateur et continue de continuer à utiliser des résultats en mauvais comportement. Au lieu de cela, vous souhaitez utiliser le retour de effacer pour obtenir le prochain itérateur valide après la valeur effacée. xxx

Cela ne fait pas non plus mal d'inclure une vérification de newlist.end () Pour tenir compte du cas où il n'y a pas au moins 5 éléments dans le Liste . xxx

comme Tim a souligné, voici une excellente référence pour < code> effacer


2 commentaires

Meilleure réponse que la mienne. Vous ne voulez pas le combiner ++ et effacer, et cela évacue parfaitement cela. Mais j'aime bien partager des liens avec certaines de mes pages de référence préférées: Liste :: Efface < / a>


@Tim, a ajouté la référence à ma réponse. C'est aussi ma page Goto pour les questions C ++ STL.



3
votes

Lorsque vous effacez un élément en position IT , l'itérateur IT est invalidé - il pointe un morceau de mémoire que vous venez de libérer.

L'effacement (IT) La fonction renvoie un autre itérateur pointant sur l'élément suivant de la liste. Utilisez celui-là!


0 commentaires


2
votes

Je fais cela:

for(list<type>::iterator i = list.begin(); i != list.end(); i++)
{
     if(shouldErase)
     { 
        i = list.erase(i);
        i--;
     }
}


5 commentaires

Il n'y a pas de problème de saut avec la réponse acceptée: la boucle ne pas incrémenter l'itérateur, IT , mais un compteur entier, i .


O Ouais, j'ai raté d'être différent lol. stupide t. Modification de ma réponse


Bien que je ne voie pas comment le code dans la réponse fonctionnerait non plus. À moins que je sois à nouveau un idiot, il semble que le code essaierait d'effacer le début de la liste, puis de l'élément suivant et de l'élément suivant jusqu'à ce que j'entiens à 5.


Parce que la question portait sur la suppression des 5 premiers éléments de la liste. Mais de toute façon, en supprimant le i ++ de la déclaration de boucle et la mettant comme une clause d'autre serait mieux.


Oui, ce serait mieux je pense. La question posait cependant de fixer la faute SEG, mais non seulement de supprimer les cinq premiers éléments de la liste. Cela vient d'être ce qu'il essayait de faire.