2009-05-16 7 views
3

J'ai une boucleOù ce code déréférencer un itérateur non valide? (C++)

for(aI = antiviral_data.begin(); aI != antiviral_data.end();) 
{ 
    for(vI = viral_data.begin(); vI != viral_data.end();) 
    { 
     if((*aI)->x == (*vI)->x && (*aI)->y == (*vI)->y) 
     { 
      vI = viral_data.erase(vI); 
      aI = antiviral_data.erase(aI); 
     } 
     else 
     { 
      vI++; 
      aI++; 
     } 
    } 
} 

Mais si jamais antiviral_data contient un élément, je reçois une erreur "vecteur iterator pas dereferencable." Pourquoi ai-je cette erreur et où déréférencer un itérateur invalide? NB: Jusqu'à présent, l'erreur se produit uniquement lorsque l'instruction if() est fausse. Je ne sais pas ce qui se passe si l'instruction if() est vraie.

Répondre

8

Quelles sont les tailles des vecteurs?

Si viral_data a plus d'éléments que antiviral_data, alors, puisque vous incrémentez aI et vI au même débit, aI sortirait des limites avant la fin de la boucle vI.

Prenez un court exemple ici:

for(int i = 0; i < 5;) 
{ 
    for(int j = 0; j < 10;) 
    { 
     i++; 
     j++; 
    } 
} 

Si vous allez sur des boucles, vous remarquerez que la boucle intérieure ne se terminera pas jusqu'à ce que les j et i sont 10, mais selon votre boucle extérieure, je ne plus alors 5.

Vous voulez incrémenter i (ou dans votre cas, aI) dans la boucle extérieure comme ceci:

for(int i = 0; i < 5;) 
{ 
    for(int j = 0; j < 10;) 
    { 
     j++; 
    } 
    i++; 
} 
+0

vI est toujours deux, aI commence à 0. Merci –

1

Le déréférencement se passe à

((*aI)->x == (*vI)->x && (*aI)->y == (*vI)->y) 

et il se produit lorsque cette déclaration est vrai pour le dernier élément de la liste antiviral_data. Dans ce cas, à la prochaine itération de la boucle interne, vous déréférencerez antiviral_data.end() ce qui n'est pas autorisé.