2012-10-17 1 views
0

J'utilise la méthode std :: multimap.lower_bound pour retourner le résultat à distance. Mais dans le même contenu de conteneur, parfois j'ai la mauvaise paire d'itérateurs et ça plante mon programme. Je peux voir le contenu dans un conteneur avec Visual Studio, ils sont tous corrects. Et j'utilise la méthode find de multimap, elle a aussi bien fonctionné. Il retourne juste les damnés itérateurs invalides paire et planter mon programme, et le plus important de cela, je ne peux pas faire de test pour passer cette situation. Quel est le problème avec cette situation?J'ai un pointeur invalide de std :: multimap.lower_bound

Mon exemple des codes comme suit:

std::multimap<std::string,std::string>::iterator it = tagged_files.lower_bound("vocal"); 
std::multimap<std::string,std::string>::iterator it_end = tagged_files.upper_bound("vocal"); 

Pour la plupart, ils ont bien fonctionné. Lorsque j'imprime it et it_end avec% p (en utilisant printf), leurs résultats sont 8f98ab9 (une valeur de pointeur) et 0 (même clé). Quand j'ai des itérateurs invalides, les messages de débogage montrent 8f98ab9 (même valeur) et 2b8a839 (valeur étrange).

En outre, la taille de tagged_files est toujours la même. Aucun élément n'a été inséré du tout pendant toute la session, même les itérateurs invalides sont reçus. Il s'est également avéré par printf% d avec tagged_files.size().

+4

sans voir de code, il sera difficile de vous aider. essayez d'écrire un programme simple qui montre et illustre votre problème, et vous obtiendrez une bonne réponse rapidement;) – Castilho

+2

Si vous utilisez 'std :: multimap' correctement, alors il ne retournera que des itérateurs valides. Ainsi, vous n'utilisez pas 'std :: multimap' correctement. Puisque nous ne pouvons pas voir ce que vous faites dans votre code, nous ne pouvons pas dire * ce que vous faites mal – jalf

+0

Je mets mon code exemple, et je prouve que je ne vérifie aucun contenu dans multimap, y compris insérer ou effacer des actions. – naive231

Répondre

2

Lorsque j'ai un itérateur invalide avec un conteneur std comme map, multimaps, 90% du temps, la raison en est que je suis itération sur le conteneur pendant que je retire des éléments dans ce conteneur.

Dès qu'un élément est retiré (ou même inséré dans d'autres conteneurs) dans un conteneur, l'état correct des itérateurs est n'est plus garanti.

edit: comme les commentaires ci-dessous disons, les règles d'invalidation des itérateurs varient d'un conteneur à l'autre. cf this question

edit2: vous ne nous montrez pas comment vous déréférencer vos itérateurs. Votre itérateur est une paire std ::, et vous devriez vérifier l'itérateur retourné n'est pas égal à yourContainer.end() avant de le déréférencer. Mais puisque vous ne nous montrez pas le code où vous derefencez l'itérateur, c'est difficile à dire. vous ne nous montrez pas non plus la façon dont vous produisez vos traces.

+0

bonne chose que les collections intégrées en Java ont une détection de modification simultanée, alors? :-) –

+1

Pour std :: map et std :: multimap, seuls les itérateurs pointant vers l'élément à supprimer sont invalidés. Tous les autres restent valides. Les règles d'invalidation de l'itérateur varient d'un conteneur à l'autre. –

+0

C'est probablement le cas; ou écrire dans la mémoire qui compose le conteneur. – rioki