Zum Inhalt springen

Debug Assertion Failed - Fehler beim dynamischen Speicherreservieren


Empfohlene Beiträge

Geschrieben

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?

Geschrieben

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!

Geschrieben

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?

Geschrieben

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.

Geschrieben

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...?

Geschrieben
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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...