Expression: list iterator not incrementable



  • Einen wunderschönen guten Abend!

    Ich habe hier einen Codeausschnitt, welcher in einer Liste mit Schüssen checkt ob diese noch "leben" und falls nicht diese löscht.
    Wenn diese Liste nun leer ist, bekommt ich die Fehlermeldung
    Expression: list iterator not incrementable.
    Hat jemand eine Idee woran das liegen kann? Bin noch mehr als weniger Anfänger in C++...

    for (auto it = mList.begin(); it != mList.end(); )
    {
                    if ((*it)->getIsAlive()==false)
                       {
                            delete(*it);
                           (*it) = nullptr;
    
                            it = mList.erase(it);
                       }
    
                     else
                    {
                             it++;
                            (*it)->update(frametime);
                    }
    }
    

    Vielen Dank im vorraus, bei weiteren Fragen kann ich natürlich auch mehr vom Code posten!



  • Ich sehe nicht, wie der Codeabschnitt den Fehler erzeugen soll. Du hast ihn aus dem Original kopiert? std::list?

    Zeile 13 und 14 sind vertauscht.

    Zeile 6 ist sinnlos.



  • std::list<>::iterator ist ein bidirektionaler Iterator, ich versteh nicht wo das Problem sein soll.
    Darf ich fragen warum du keinen Vector benutzt?



  • HALT, STOP,
    ich hab hier was verwechselt.
    Wenn ich das "it++" oben in der for Schleife anstatt im else mit unterbringe, dann kommt der Fehler wenn die Liste leer ist.
    Wenn ich wie jetzt das it++ im else habe, kommt der Fehler wenn ich das erste mal einen Shot spawnen möchte.

    Enschuldigt bitte, ich gerate noch durcheinander :p



  • Mit einer leeren Liste wird die Schleife garnicht ausgeführt.



  • SatchBoogie schrieb:

    Wenn ich das "it++" oben in der for Schleife anstatt im else mit unterbringe, dann kommt der Fehler wenn die Liste leer ist.

    Angenommen erase() setzt it auf mList.end() (weil es das letzte Element gelöscht hat) und das ++it im Schleifenkopf will it dann noch weiterbewegen...

    SatchBoogie schrieb:

    Wenn ich wie jetzt das it++ im else habe, kommt der Fehler wenn ich das erste mal einen Shot spawnen möchte.

    Was passiert denn im else Zweig mit dem geschundenen Iterator? erst erhöhen, dann dereferenzieren?! Ist das cool? Insbesondere beim letzten Element?



  • AHH selbsverständlich Furble!
    Ich muss natürlich erst mit it arbeiten (also in diesem Falle

    (*it)->update(frametime);
    

    und dann it erst erhöhen!
    Vielen Dank für den Tipp, ist logisch, aber auch
    Übungssache :p



  • SatchBoogie schrieb:

    Einen wunderschönen guten Abend!

    delete(*it);
                           (*it) = nullptr;
    

    Kleiner Tip am Rande,

    du solltest in deiner Liste keine rohen Zeiger speichern. Nimm lieber unique_ptr. Da kannst du die den Kram oben sparen, da die automatisch mit Löschen des Eintrags in der Liste freigegeben werden.



  • genau das Problem hatte ich damals auch. Es handelt sich hierbei um SFML Programmierung mit snem KometenWeltraum Shooter. War damals über den gleichen Fehler gestolpert und habe dann ebenfalls Smart Pointer verwendet. Da die Objekte auf die die Pointer in der Liste zeigen Asteroiden sind, die nach unterschiedlichen Sekunden gelöscht werden und nicht sequentiell, macht ne Liste durchaus Sinn.


Anmelden zum Antworten