![]() |
free erzeugt Fehler
Hallo zusammen,
ich habe da ein Problem mit der free Methode:
Delphi-Quellcode:
...
levels[3] := levels[1]; ... destructor TSpielverwalter.Destroy; var i: integer; begin for i := 0 to high(levels) do levels[i].free; inherited; end; Wenn die Schleife jetzt bei 3 ankommt, gibt's einen Fehler, nämlich "Erste Gelegenheit für Exception bei $758EB727. Exception-Klasse EInvalidPointer mit Meldung 'Ungültige Zeigeroperation'. Prozess SpielOGLProject1.exe (972)" Das ganze passiert, weil der Speicherplatz schon bei levels[1] feigegeben wird; das habe ich verstanden, nur habe ich keine Idee, wie ich das Problem ordentlich umgehen könnte |
AW: free erzeugt Fehler
Beim Löschen immer von Hinten, denn mit jedem Löschen, wird die Anzahl der Elemente ja kleiner
Delphi-Quellcode:
for i := high(levels) to low(level) do
levels[i].free; |
AW: free erzeugt Fehler
Er löscht ja nicht, er gibt ja nur frei.
Versuchs mal mit FreeAndNil(levels[i]) und prüfe davor auf Assigned(levels[i]). |
AW: free erzeugt Fehler
Free prüft auch ob die Klasse <> NIL ist
|
AW: free erzeugt Fehler
Ja, Free setzt aber nichts auf nil.
Mir ist aber gerade aufgefallen, dass das gar nichts mit dem Problem zu tun hat. |
AW: free erzeugt Fehler
Ging ja auch nur um das assigned()..
|
AW: free erzeugt Fehler
Eure Vorschläge funktionieren alle leider nicht:
Erster Versuch:
Delphi-Quellcode:
for i := 0 to high(levels) do
if Assigned(levels[i]) then FreeAndNil(levels[i]); Dieser Code gibt zwar keinen Fehler aus, aber die Schleife wird auch nur einmal durchgegangen
Delphi-Quellcode:
for i := high(levels) to low(levels) do
levels[i].free; Hier gibt's dann wieder einen Fehler
Delphi-Quellcode:
for i := high(levels) downto low(levels) do
levels[i].free; |
AW: free erzeugt Fehler
Ansonsten bastel dir eine Assign Methode, um alle Eigenschaften in das Level zu kopieren. Dann kannst du diese Klassen so freigeben. Beispiel:
Delphi-Quellcode:
Du musst dann TLevel von TPersistent ableiten
level[0]:=TLevel.create;
level[0].Assign(level[1]); procedure TLevel.Assign(ASOurce:TPersistent); begin if (ASource is TLevel) then Self.Name := (ASOurce as TLevel).Name; //für alle attribute machen else inherited Assign(ASOurce); end; |
AW: free erzeugt Fehler
Moin,
naja der Fehler ist ja klar: Es wird vorher schon bereits ein weiter hinten liegendes Element gelöscht. Da hilft dann FreeAndNil() auch wenig, da nicht der hinten liegende Zeiger genilt wird (oder liege ich da falsch). Deshalb würde ich in diesem Fall echt assign verwenden! MfG Fabian |
AW: free erzeugt Fehler
Eine andere Möglichkeit sehe ich auch nicht, da level[3] ja nicht mitbekommt, wenn level[1] freigegeben wird, egal ob mit Free oder FreeAndNil. Ansonsten müsste man ja irgendwo hinterlegen, wo überall gleiche Instanzverweise existieren und diese dann beim Freigeben alle nullen, aber das halte ich für ein sehr gefährliches und fehleranfälliges Unterfangen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz