Du verletzt die "Rule of three"
http://en.wikipedia.org/wiki/Rule_of_thr…_programming%29
Schematischer Ablauf was passiert, und wo das Problem ist:
- Du erstellst ein Sprite. m_pImage ist uninitialisiert, und wird vom ctor nichteinmal auf 0 gesetzt (potentiell gefährlich)
- als nächstes Lädst du das Sprite, ab jetzt ist alles wunderbar
- du kopierst das Sprite in die Liste. Du hast keinen Kopierkonstruktor, also generiert der Compiler einen für dich, der eine flache Kopie erzeugt
- jetzt hast du 2 Objekte, deren p_Image-Zeiger auf den selben Speicherbereich zeigen
- sobald du eines von ihnen löschst, wird dessen Destruktor aufgerufen und der Zeiger ist ungültig. Weil das andere Objekt den selben Zeiger hatte, ist sein Speicher nun auch ungültig
- sobald du jetzt das zweite Objekt löschst oder zum Rendern benutzt, wird auf ungültigen Speicher zugegriffen, das kann nur schief gehen
Du hast also eine Klasse, die man nicht korrekt kopieren kann und tust es trotzdem. Jede Klasse, von der du nicht sicher bist, ob man sie korrekt kopieren kann, sollte das Kopieren vollständig verbieten, zum Beispiel mittels:
http://www.boost.org/doc/libs/1_52_0/lib…ass_noncopyable
Mehr Infos zum Thema:
http://en.wikibooks.org/wiki/More_C%2B%2…-copyable_Mixin
Jetzt kannst du die Klasse nicht mehr in die Liste packen, du kannst aber sehr wohl std::unique_ptr's in die Liste packen. Oder du übst Kopierkonstruktor schreiben und machst diene Spriteklasse kopierbar.
Wenn du noch nicht dazu bereit bist, dich in derart fortschrittliche Themen einzuarbeiten, ist die wohl einfachste Lösung, Zeiger auf dynamisch allokierte Objekte (mittels new) in die Liste zu packen, und am Ende alle Objekte von Hand zu löschen. Dadurch umgehst du auch das Kopieren der Objekte. Beispiel:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
|
list<CSprite*> SpriteList;
SpriteList.push_back(new CSprite("meinTollesBild.bmp");
//und wenn du die Spriteliste löschen willst:
for(list<CSprite*>::iterator it=SpriteList.begin(); it!=SpriteList.end(); ++it)
{
delete *it;
}
SpriteList.clear();
|