Ich bin dabei ein kleines Motörchen für ein mini Spiel zu bauen und stehe bei einem Problem an.
Das Mini-Spiel sollte später einmal in der in der Lage sein, Spieler und Kreaturen als Objekte zu erzeugen, diese mittels einfachem würfeln gegeneinander antreten zu lassen und diese gegeben Falls wieder ins Nirvana zu befördern :-)
Ueberlegt habe ich mir dabei folgenes:
Die Engine (also das Motörchen, ;-)), verwaltet dabei alle Listen der Objekte. Also die Player-Liste und die Kreaturen-Liste.
Soll ein Objekt erzeugt oder gelöscht werden, geht das nur über die Methode, welche die Engine zu Verfügung stellt.
CreatePlayer(), DeletePlayer(), CreateCreature(), DeleteCreature().
Eine weitere Ueberlegung war, dass wenn das Engine-Objekt selbst gelöscht wird, sämtliche in den Listen enthaltenen Objekte ebenfalls gelöscht werden.
Quasi ein sauberes "herunterfahren".
Dazu rufe ich dann einfach die entsprechende Methode (DeletePlayer()) im Desturktur des Engine-Objekts auf.
Die main funktion sieht folglich noch sehr bescheiden aus:
Code: Alles auswählen
BEAST_Engine engine;
engine.CreatePlayer();
engine.DeletePlayer();
return 0;
Code: Alles auswählen
int BEAST_Engine::CreatePlayer() {
cout << "- Methode CreatePlayer von BEAST_Engine wurde aufgerufen" << endl;
LISTplayer.push_back(new BEAST_Player);
return 0;
}
int BEAST_Engine::DeletePlayer() {
cout << "- Methode DeletePlayer von BEAST_Engine wurde aufgerufen" << endl;
for (iLISTplayer = LISTplayer.begin(); iLISTplayer != LISTplayer.end(); ++iLISTplayer) {
delete (*iLISTplayer);
}
return 0;
}
"Debug Assertion Failed!
Program: (Dateipfad)
File: ...debug_heap.cpp
Line:888
Expression: _CrtIsValidHeapPointer(block)
"
Mit dem Vermerk, ich soll doch mal die Jungs und Mädels von zfx fragen :-D
Irgendwie scheine ich da etwas zu machen, was nicht zulässig ist.
Ich kann mir aber keinen Reim drauf machen, denn wenn ich das engine.DeletePlayer(); in der main entferne, läuft das Programm ohne Fehlermeldung ab.
Eine andere Frage, die in dem Zusammenhang aufgetaucht ist, ist folgende:
Darf ich mich bei einem vector oder einer list (STL) darauf verlassen, das die Adresse eines Objektes immer konstant bleibt.
Das wäre nämlich Voraussetzung für mein Konzept.
Zufälligerweise bin ich bei golem.de in einem Beitrag über C und Rust auf folgende Aussage eines Users gestossen:
"Damit deckst du leider nicht alles ab. Wenn du bspw. eine Referenz zu einem Vector-Element hast und du fügst ein weiteres Element in Vector hinzu und der Vector macht intern ein realloc, weil der Speicherplatz nicht mehr ausreicht, dann wird deine alte Referenz ungültig. "
https://forum.golem.de/kommentare/secur ... ,read.html
Wenn das richtig ist, dann dürfte man ja eigentlich gar keine Pointers anlegen, welche auf Objekte zeigen, die sich in einem Vector befinden.
Gruss starcow