2012-03-30 10 views
5

fa ho un vector che contiene i puntatori a tipo astratto Rock:scorrendo un errore di vettore di causa, ma standard per-ciclo non

vector<Rock*> rocks; 

Se io ciclo attraverso il vettore con un iteratore e quindi provare a accedere alla oggetto (una classe non astratta che estende Rock) tramite l'iteratore, ottengo un errore 'EXC_BAD_ACCESS' in XCode 4:

vector<Rock*>::iterator rockIter; 
for (rockIter = rocks.begin(); rockIter != rocks.end(); ++rockIter) 
{ 
    bullet.hit(*(*rockIter)); 
} 

Ma scorrendo normalmente come c'è problema:

for (int i = 0; i < rocks.size(); i++) 
{ 
    bullet.hit(*rocks[i]); 
} 

La funzione hit() assomiglia:

bool Bullet::hit(Rock & rock) 

ho pensato che *(*rockIter) e *rock[i] sarebbe fare la stessa cosa ma chiaramente essi non. Che cosa è diverso e come posso passare un riferimento di un oggetto nel vettore tramite un iteratore come faccio con *rock[i]?

+0

Vale la pena ricordare che vorrete usare un vettore di puntatori intelligenti invece di puntatori grezzi. Rendono la tua vita molto più facile. – chris

risposta

7

Senza vedere altro codice Non sono sicuro se questo è il problema, ma il codice è bullet.hit() che modifica il vettore aggiungendo elementi? Se lo è e si sta iterando su di esso utilizzando un iterator, quell'iteratore verrà invalidato e qualsiasi riferimento futuro su di esso comporterà un comportamento indefinito. Tuttavia, l'utilizzo del ciclo basato su standard int non presenta questo problema, poiché gli accessi per indice non possono essere invalidati.

Spero che questo aiuti!

+1

Ah grazie! Questo era il problema. Molti livelli delle funzioni chiamate in 'hit()' ci sono stati cambiamenti nel vettore e me ne sono completamente dimenticato! –

Problemi correlati