Jonsc1 Geschrieben 30. November 2005 Teilen Geschrieben 30. November 2005 Habe anscheinend mal wieder einen blöden Fehler eingebaut... Der Debugger bringt mich auch nicht viel weiter, desswegen wende ich mich mal wieder an euch. Habe ein wenig mit Vererbung rumgespielt und dabei die Klasse "Cjaeger" erstellt, die von "Craumschiff" erbt. Jetzt versuche ich mir Speicher auf dem Heap zu reservieren... Das klappt auch so weit... aber wenn ich den Speicher wieder freigeben will bricht das Programm mit einer Fehlermeldung ab... Also, hier nochmal Klartext: ... // // Dynamische Speicherreservierung jaeger *data; //Zeiger vom Typ Jaeger erzeugen data = new jaeger[3]; //Speicher reservieren für 1 Jaeger data[1].starten(); data[1].landen(); delete data; ... Das Programm gibt nun folgendes aus: Programm gestartet! Raumschiff erzeugt! - Jaeger erzeugt! Raumschiff erzeugt! - Jaeger erzeugt! Raumschiff erzeugt! - Jaeger erzeugt! Raumschiff gestartet! Raumschiff gelandet! Jaeger wurde gelöscht! Laut debugger bricht das Programm bei der "delete" Zeile ab. Und zwar mit folgender Fehlermeldung: Debug Assertion Failed! Programm: ... (der Pfad der ExeDatei) File: dbgheap.c Line: 1011 Expression: _CrtIsValidHeapPointer(pUserData) Jemand eine Idee? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 30. November 2005 Teilen Geschrieben 30. November 2005 Auf jeden Fall musst du delete[] benutzen. Ich vermute aber, dass du zusätzlich noch irgendwo zwischen new und delete in nicht allokiertem Speicher herumschreibst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jonsc1 Geschrieben 30. November 2005 Autor Teilen Geschrieben 30. November 2005 Nee, im Speicher hab ich nicht rumgeschrieben... Aber du hattest recht. Wenn ich delete[] verwende werden alle erzeugten Objekte gelöscht und das Programm läuft sauber durch Danke! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jonsc1 Geschrieben 30. November 2005 Autor Teilen Geschrieben 30. November 2005 Hmm... das wirft gleich die nächste Frage auf... Wie gebe ich nur den Speicher für EIN Objekt in einem Array frei... Also wenn ich mir Speicher für 10 Jaeger reserviere, und ein Jaeger zerstört wird (RTS), ist es ja sinnvoll den Speicher wieder freizugeben... wenn ich jetzt aber delete verwendet wird gleich das ganze Array gelöscht... Also, wie kann ich das anstellen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 30. November 2005 Teilen Geschrieben 30. November 2005 Dann solltest du gar kein Array verwenden, sondern einen der Container der Standardbibliothek. Wenn du viel anfügst und wieder löschst, würde sich std::list anbieten. Das hätte auch gleich noch den angenehmen Nebeneffekt, dass du dich gar nicht mehr mit new und delete herumschlagen müsstest, weil der Container dir das Speichermanagement komplett abnimmt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jonsc1 Geschrieben 30. November 2005 Autor Teilen Geschrieben 30. November 2005 Also würde sich für ein Strategiespiel in dem die einzelnen Einheiten durch Instanzen der entsprechenden Klasse dargestellt werden std::list empfehlen? Dann werden ja andauernd Instanzen gelöscht (Einheiten zerstört, getötet) und wieder neue erstellt (Einheiten gebaut)... Kümmert sich std::list um die gesamte Speicherverwaltung? Also auch das der Speicher nicht fragmentiert etc...? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 30. November 2005 Teilen Geschrieben 30. November 2005 Also würde sich für ein Strategiespiel in dem die einzelnen Einheiten durch Instanzen der entsprechenden Klasse dargestellt werden std::list empfehlen?So pauschal kann man das nicht sagen. Die einzelnen Container garantieren dir obere Schranken für die Komplexität der Operationen (Einfügen am Anfang, am Ende, in der Mitte, Löschen, indexbasierter Zugriff usw.). Und von den Standardcontainern ist std::list der schnellste, was das Löschen und Hinzufügen in der Mitte angeht. Dafür sind andere Operationen mit der Liste langsamer als mit anderen Containern. Kümmert sich std::list um die gesamte Speicherverwaltung? Also auch das der Speicher nicht fragmentiert etc...?Nein, das überlässt jeder Container dem Allocator. Du kannst einen eigenen Allocator benutzen, aber das solltest du wirklich erst dann machen, wenn du nachweisen kannst, dass Speicherfragmentierung ein konkretes Problem darstellt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.