2016-04-23 6 views
0

Ok, so habe ich es geschafft, eine Methode zum Löschen von Runen in meinem Spiel zu schreiben, aber ich bekomme ständig diesen Fehler und ich weiß nicht warum. Irgendwelche Ideen, wie man mit dem Problem umgeht? Außerdem möchte ich diesen I-Iterator loswerden, aber dann weiß ich nicht, wie man für die Rakete richtig löscht und löscht.C++, Visual Studio 2015, Vektor Iterator nicht dereferenzierbar

{ 
     int i = 0; 
     for (auto it = missle_vector.begin(); it != missle_vector.end(); ++it) { 
      score += missle_vector[i]->collision(i, missle_vector, enemy_vector, obstacle_vector, 1); 
      displayMissle(**it); 
      (*it)->moove(50, 0); 
      i++; 
     } 
    } //this is how i use it 

int Missle::collision(unsigned int i, vector <Missle*> &missle_vector, vector <Enemy*> &enemy_vector, 
          vector <Obstacle*> &obstacle_vector, bool G) 
{ 
int hit=0; 
for (auto it=enemy_vector.begin(); it!=enemy_vector.end();) 
{ 
    double x, y; 
    x=(*it)->getX()-getX(); 
    y=(*it)->getY()-getY(); 
    if (x<64 && x>-151 && y<14 && y>-103) 
    { 
     delete missle_vector[i]; 
     missle_vector.erase(missle_vector.begin() + i); 
     delete *it; 
     enemy_vector.erase(it); 
     hit++; 
    } 
    else 
     ++it; 
} 
if(G){ 
for (auto it=obstacle_vector.begin(); it!=obstacle_vector.end(); ++it) 
    { 
     double x, y; 
     x=(*it)->getX()-getX(); 
     y=(*it)->getY()-getY(); 
     if (x<64 && x>-61 && y<14 && y>-61) 
     { 
      delete missle_vector[i]; 
      missle_vector.erase(missle_vector.begin()+i); 
     } 
    } 
} 
if (getX()>1920) 
{ 
    delete missle_vector[i]; 
    missle_vector.erase(missle_vector.begin()+i); 
} 
return hit; 
} //method itself 
+0

Es ist ziemlich unklar, was dieser Code eigentlich * tun * soll. Zum Beispiel sehe ich, dass Sie "' missle_vector [i] '[sic]" in einer Schleife löschen. Aber "ich" ändert sich nicht. Ist das beabsichtigt? Ich weiß, dass der nachfolgende Aufruf zum Löschen das Element aus dem Vektor entfernt, aber es ist mir nicht klar, warum Sie den i-ten Index von diesem Vektor entfernen wollen. Was versuchst du zu machen? –

+0

Ich habe die Art und Weise, wie ich die Methode verwende, bearbeitet. Dies sollte das Missverständnis klären. – Volterra

+0

Erstens erklärt das nicht wirklich, was Sie versuchen zu tun. Zweitens zeigt das nur * mehr Probleme und Fehler *, da Sie versuchen, einen Iterator zu verwenden, der möglicherweise ungültig gemacht wurde. Grundsätzlich muss die Logik all dieser Systeme von Anfang an neu gedacht werden. –

Antwort

1

Dies ist eine Behauptung:

Vector iterator not dereferencable 

und es bedeutet, dass Sie derefencing und Iterator, die zum Beispiel Ende Iterator ist. Zum Beispiel wird dieses kurze Beispiel diese Behauptung erzeugen:

std::vector<int> v; 
*v.end(); 

diese Behauptung zur Laufzeit während der Fehlersuche angezeigt werden soll und ermöglicht es Ihnen, genauen Ort, an dem Problem exissts zu finden. In Visual Studio können Sie den Debugger verwenden, um lokale Variablen zu suchen, Call-Stack.

[Bearbeiten]

ein Ort, wo man diese Behauptung in Ihrem Code bekommen hier ist:

enemy_vector.erase(it); 

dies sein sollte:

it = enemy_vector.erase(it); 

sonst nächste Iteration in Ihrem es wird ungültig sein und * es wird Vector iterator not dereferencable ergeben. Auch it!=enemy_vector.end() sollte Undefined Behavior sein.

+0

Aus Stimmen, aber Ehre +1 von mir :) –

+0

Danke, mein Schlechter. Das habe ich komplett vergessen. Aber das war nicht der einzige Fall. Auch wenn ich nur die letzten if (letzten 5 Zeilen) in der Methode belassen, bekomme ich diesen Fehler. – Volterra

+0

Wenn der Fehler unter einem Debugger ausgeführt wird, sollte der Stack-Trace Informationen über die Verwendung des ungültigen Iterators enthalten. Das gibt Ihnen möglicherweise auch einen Hinweis darauf, warum der Iterator ungültig ist. –