2010-11-29 7 views
5

J'essaye d'effacer un pointeur sur un objet, mais je continue à écraser la console (PS2), je ne reçois aucune erreur à cause de la façon dont la console est configurée, donc je Je ne suis pas tout à fait sûr de ce qui se passe.Effacement d'un pointeur d'un vecteur

J'ai énuméré les deux lignes d'erreur, cela n'a pas d'erreur jusqu'à ce que j'ai ajouté ces lignes.

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'est-ce que je fais mal?

Merci.

EDIT: Clarification, ayant juste cette ligne.

listIter = m_downDirectionList.erase(listIter); 

cela aussi des erreurs.

+1

Je ne sais pas ce que 'm_downDirectionList' est, vraiment, ou ce' releaseAProjectile' fait. Je ne sais pas non plus quel type d'erreur ou vos techniques de test ou si l'erreur est cohérente. –

+0

A propos de la modification. Si vous faites référence à ma solution, j'ai fait plus que simplement ajouter cette ligne. J'ai également déplacé l'incrément d'itérateur vers le bloc else. J'allais éditer ma réponse avec une explication après que j'ai posté mais [Kos] (http://stackoverflow.com/questions/4305002/erasing-a-pointer-from-a-vector/4305045#4305045) déjà expliqué le problème . –

+0

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

Répondre

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

Egalement correct et élégant (ma petite remarque à propos de ++ listIter tient encore, bien que :)) – Kos

+0

Il convient de noter que cela fonctionne parce que c'est un vecteur (oui, c'est clair, mais la question et la réponse sont loin dans l'espace. ..). – gimpf

0
m_downDirectionList.erase (listIter);