2013-02-18 2 views
0

J'ai un vector<int> appelé pitches. Je reçois bad access périodique sur la dernière ligne ci-dessous:Mauvais accès à l'itérateur vecteur de lecture

int play = 0; 
bool didFind = 0; 
vector<int>::const_iterator iterator; 

for (iterator = pitches.begin(); iterator != pitches.end(); ++iterator) { 
    if (*iterator > lastpitch) { // lastpitch is an int 
     didFind = 1; 
     play = *iterator; 
     break; 
    } 
} 

if (!didFind) play = *(pitches.begin()); // this line gives me bad access 

J'avais déjà essayé *pitches.begin() sur la dernière ligne, mais que l'accès toujours fourni mauvais et je comprends maintenant. Mais tandis que je l'obtiens moins souvent maintenant, ce play=*(pitches.begin()); fait toujours la même occasionnellement. Je ne vois rien dans ce qui précède qui causerait cela, aucune suggestion appréciée.

+1

Le vecteur est-il vide à ce moment-là, peut-être? (En particulier, en tenant compte du fait que 'didFind' est faux ici.) – jogojapan

+1

Une note sur le style: il est généralement préférable d'utiliser true/false au lieu de 1/0 lorsqu'il s'agit de' bool's. – jaymmer

+0

@jaymmer merci pour suggestion. – johnbakers

Répondre

4

Si pitches vecteur a une taille 0, les choses à l'intérieur

 for (iterator=pitches.begin();iterator!=pitches.end();++iterator) 

ne soit pas exécuté et, par conséquent didFind=0. L'instruction if est évaluée. Pourtant pitches est vide signifie pitches.begin()==pitches.end(). Déréférencement d'un pitches.end() est d'accéder en dehors de la limite et donne donc bad access.

+0

Je déboguerai mais Je suis certain que le vecteur n'est jamais vide. Je le saurai bientôt, merci. – johnbakers

+0

@SebbyJohanns puis ajoutez un 'assert (pitches.size())' avant toutes ces séquences à vérifier. – phoeagon

+0

En effet il y avait un cas isolé où le vecteur pouvait être vide. – johnbakers

Questions connexes