2012-03-30 11 views
5

Tengo un vector que contiene punteros para abstraer tipo Rock:iteración a través de un vector de error causa sino bucle for norma no

vector<Rock*> rocks; 

Si bucle a través del vector con un iterador y luego tratar de acceder al objeto (una clase no abstracta que se extiende Rock) a través del repetidor, me sale un error 'EXC_BAD_ACCESS' en Xcode 4:

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

Pero bucle a través de lo que normalmente le gusta es ningún problema:

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

La función hit() parece:

bool Bullet::hit(Rock & rock) 

pensé que *(*rockIter) y *rock[i] haría lo mismo pero es evidente que ellos no. ¿Qué es diferente y cómo puedo pasar una referencia de un objeto en el vector a través de un iterador como hago con *rock[i]?

+0

Vale la pena mencionar que querrá utilizar un vector de punteros inteligentes en lugar de punteros sin procesar. Ellos hacen tu vida mucho más fácil. – chris

Respuesta

7

Sin ver más código No estoy seguro de si este es el problema, pero ¿está cambiando el vector el código en bullet.hit() al agregar elementos? Si es así y está iterando sobre él usando un iterator, ese iterador se invalidará y cualquier desreferencia futura en él dará como resultado un comportamiento indefinido. Sin embargo, usar el estándar int-based for loop no tendrá este problema, porque los accesos por índice no se pueden invalidar.

Espero que esto ayude!

+1

¡Ah, gracias! Este era el problema. Muchas capas de las funciones llamadas en 'hit()' ¡hubo un cambio en el vector y me olvidé por completo! –

Cuestiones relacionadas