Fehler: list iterator not dereferencable
-
Hallo,
Ich habe zwei Klassen (AnimationImages und Animation) Die erste speichert die Bilder für mehrere Animationen und die zweite ist das animierte Sprite:#include <SFML/Graphics.hpp> #include <vector> #include <list> namespace Animation { class AnimationImages { private: bool Geladen; std::vector<std::list<sf::Image>> Frames; public: AnimationImages(); void Load(std::string AnimName, __int16 x, std::vector<unsigned __int16> y); std::list<sf::Image>::iterator& GetBegin(int AnimID); std::list<sf::Image>::iterator& GetEnd(int AnimID); }; AnimationImages::AnimationImages() {} void AnimationImages::Load(std::string AnimName, __int16 x, std::vector<unsigned __int16> y) { //... Geladen = true; } std::list<sf::Image>::iterator& AnimationImages::GetBegin(int AnimID) { return(Frames[AnimID].begin()); } std::list<sf::Image>::iterator& AnimationImages::GetEnd(int AnimID) { return(Frames[AnimID].end()); } class Animation : public sf::Sprite, public sf::Thread { public: __int16 AnimID; std::list<sf::Image>::iterator CurrImg; //Iterator auf das aktuelle Bild AnimationImages* Frames; //Pointer auf die aktuelle Animation Animation(); virtual void Run() override; }; Animation::Animation() {} void Animation::Run() { CurrImg = Frames->GetBegin(AnimID); while(true) { if(Frames->BilderGeladen()) { SetImage(*CurrImg); if(CurrImg == Frames->GetEnd(AnimID)) { CurrImg = Frames->GetBegin(AnimID); } else { CurrImg++; } } } } }Wenn ich das Programm starte dann tritt der Fehler "list iterator not dereferencable" auf. Per Debugger habe ich herausgefunden, das dies durch Zeile 43 ausgelöst wird, leider weiß ich aber nicht warum. Weiß jemand von Euch, wo der Fehler liegt?
Danke schon im Voraus.
mfg
mr x
-
Du hast dort eine Endlosschleife, und es scheint so, als ob die Anweisung im
else-Zweig zu oft ausgeführt würde, wodurch sichCurrImgausserhalb der gültigen Iterator-Range befindet.Es wäre nächstes Mal nett, du würdest gleich die relevanten Typen (hier
CurrImg) angeben.
-
Der Iterator zeigt auf eine ungültige Stelle. Entweder das Ende oder auf ein Objekt, welches zerstört wurde. Irgendwo hat es daher einen Logikfehler in deinem Programm.
@Nexus,
Der Typ ist angegeben, nur schwer zu finden
Grüssli
-
Du hast dort eine Endlosschleife, und es scheint so, als ob die Anweisung im else-Zweig zu oft ausgeführt würde
Ich habe probehalber diese Anweisung schon weggelassen. Selber Fehler...
Beim Debuggen habe ich noch herausgefunden, das der Iterator schon in Zeile 40 ungültig ist. Der Iterator, den die Funktion GetBegin zurückgibt, ist inerhalb dieser Funktion gültig. der zurückgegebene Iterator ist jedoch ungültig.
Ich kann mir aber nicht erklären, warum...
-
Wird der Frames-Zeiger überhaupt irgendwo initialisiert?
-
MFK schrieb:
Wird der Frames-Zeiger überhaupt irgendwo initialisiert?
Ja er wird außerhalb des angegebenen Codes initialisiert. Der Debugger zeigt mir auch zum Zeitpunkt des Fehlers an, das Frames auf ein gültiges Objekt zeigt.
-
Du musst die Prüfung auf End und das Zurücksetzen durchführen, bevor du den Iterator verwendest. Der End-Iterator zeigt eins hinter das letzte Element, und darf nicht mehr dereferenziert werden.
-
Mit
while(true)hast du aber nach wie vor eine Endlosschleife. Da dort nirgends einbreak,return,throwodergotovorkommt, verlässt du die Schleife nie (ich nehme nicht an, dass du sie über eine Exception der aufgerufenen Funktionen verlässt).
-
Vermutlich wird in der Funktion GetBegin() der Iterator einer Kopie der Liste zurückgegeben, die es nach GetBegin nicht mehr gibt. Ursache dafür ist häufig, dass in GetBegin() etwas wie "return GetListe().begin()" steht, wobei GetListe() selbst widerum keine std::list<>&, sondern eine std::list<> by-value zurückgibt.
-
LordJaxom schrieb:
Vermutlich wird in der Funktion GetBegin() der Iterator einer Kopie der Liste zurückgegeben, die es nach GetBegin nicht mehr gibt.
Da brauchst du nichts zu vermuten, die Implementierung von GetBegin() steht doch da. Wäre mir neu, dass std::vector::operator[] eine Kopie zurückgibt

Die Schleife ist schlicht und einfach falsch aufgebaut. SetImage wird mit dem dereferenzierten End-Iterator aufgerufen.
-
Installier mal Windows neu