2010-11-29 17 views
5

Estoy tratando de borrar un puntero a un objeto, pero sigo rompiendo la consola (PS2), no obtengo ningún error debido a la forma en que está configurada la consola, entonces No estoy muy seguro de lo que está pasando.Borrando un puntero de un vector

He enumerado las dos líneas de ese error, esto no falló hasta que agregué estas líneas.

for(listIter = m_downDirectionList.begin(); listIter != m_downDirectionList.end(); listIter++) 
    { 
     Projectile* proj = dynamic_cast<Projectile*>(*listIter); 

     if (proj->getZWorldCoord() >= (defaultLevelDepth + zOffset)) 
     { 
      proj->getPoolOwner()->releaseAProjectile(proj); 
      //(*listIter) = NULL; // THIS ERRORS, also tried = 0. 
      //listIter = m_downDirectionList.erase(listIter); // THIS ALSO ERRORS 
     } 

     else 
     { 
      (*listIter)->update(camera, zOffset); 
     } 
    } 

¿Qué estoy haciendo mal?

Gracias.

EDITAR: Aclaración, acaba de tener esta línea.

listIter = m_downDirectionList.erase(listIter); 

esto también los errores.

+1

No sé lo que 'm_downDirectionList' es, en realidad, o lo que' releaseAProjectile' hace. Tampoco sé qué tipo de error, o sus técnicas de prueba, o si el error es consistente. –

+0

Sobre la edición. Si te refieres a mi solución, hice más que simplemente agregar esa línea. También moví el incremento del iterador al bloque else. Iba a editar mi respuesta con una explicación después de publicar pero [Kos] (http://stackoverflow.com/questions/4305002/erasing-a-pointer-from-a-vector/4305045#4305045) ya explicaba el problema . –

+0

Dupe of http://stackoverflow.com/questions/2728551/c-iterators-problem/2728567? – AshleysBrain

Respuesta

5
for(listIter = m_downDirectionList.begin(); listIter != m_downDirectionList.end();) 
    { 
     Projectile* proj = dynamic_cast<Projectile*>(*listIter); 

     if (proj->getZWorldCoord() >= (defaultLevelDepth + zOffset)) 
     { 
      proj->getPoolOwner()->releaseAProjectile(proj); 
      listIter = m_downDirectionList.erase(listIter); 
     } 

     else 
     { //m_downDirectionList[p]->update(camera, zOffset); 
      (*listIter)->update(camera, zOffset); 
      listIter++ 
     } 
    } 
+0

También correcto y elegante (mi pequeña observación sobre ++ listIter aún se mantiene, aunque :)) – Kos

+0

Cabe señalar que esto funciona porque es un vector (sí, está claro, pero la pregunta y la respuesta están muy lejos espacialmente. ..). – gimpf

0
m_downDirectionList.erase (listIter); 
Cuestiones relacionadas