![]() |
werden pointer automatisch aus dem Speicher gelöscht?
Hi@all!
Ich hab hier sone Verkettung von Pointern:
Delphi-Quellcode:
Die sind eben immer mit aComputer.NextComputer.NextComputer.... usw. verknüpft.
aComputer = ^TElement;
TElement = record aName:String; aIP:String; aDescription:String; aPicture:Tbitmap; NextComputer:aComputer; end; Wenn ich jetzt einen Pointer lösche, setzte ich jetzt den Vorgänger des zu löschenden Pointers auf den Nachfolger des zu löschenden Pointers. Danach versuche ich mit freeandnil(zulöschenderPointer) noch ein bisschen aufzuräumen, aber bekomme immer Speicherverletzungen!!! Meine Frage: kann es sein, dass Delphi irgendwie den Pointer selbstständig löscht? |
Re: werden pointer automatisch aus dem Speicher gelöscht?
Zitat:
...:cat:... |
Re: werden pointer automatisch aus dem Speicher gelöscht?
Zitat:
|
Re: werden pointer automatisch aus dem Speicher gelöscht?
Zitat:
Du hast das zu löschende Element schon aus der Liste rausgenommen. Also kommst Du nicht mehr an dieses Element dran. Wie willst Du es löschen? Lösung: Du gehst die Liste solange durch, bis du das Element vor dem zu löschenden Element gefunden hast. Jetzt merkst Du Dir den Nachfolger des zu löschenden Elements in einer temporären Variablen. Nun kannst du mit Free (Element.NextComputer) oder Delete (Element.NextComputer) das zu löschende Element löschen und dann die Liste neu verknüpfen (mit Hilde der temp.Variablen). Ob Du Free oder Delete oder was anderes benötigst, hängt davon ab, wie Du die Elemente erzeugst. |
Re: werden pointer automatisch aus dem Speicher gelöscht?
Zitat:
folgende Procedure:
Delphi-Quellcode:
Ich hab zwar den Pointer schon aus der Liste rausgenommen, aber die Variable Computer zeigt ja noch auf das Element, oder?procedure TForm1.DeleteComputerFromList(Computer:aComputer); var laufComputer:acomputer; begin laufComputer:=FirstComputer; //die Wurzel, FirstComputer selbst enthält keine Informationen while (LaufComputer.nextcomputer<>Computer) and (LaufComputer.NextComputer<>NIL) do begin laufcomputer:=laufcomputer.NextComputer; end; LaufComputer.NextComputer:=Computer.NextComputer; freeandnil(Computer) end; |
Re: werden pointer automatisch aus dem Speicher gelöscht?
Du verwendest freeandnil zur Freigabe eines records.
Das geht nicht! OnlineHilfe gibt folgendes wieder: Zitat:
onlinekater |
Re: werden pointer automatisch aus dem Speicher gelöscht?
Wie legst du denn den Speicher für dein Record an? Mit Create? Wohl nicht, also auch kein FreeAndNil()!!
Ich vermute ganz stark, dass du New() verwendest und ein Blick in die Hilfe hätte dir das Pendant Dispose() zum freigeben verraten. Und sakura hätte dir das bestimmt auch geschrieben, aber du fragtest halt nur, ob Delphi den Speicher selber frei gibt - und das tut Delphi nunmal nicht. FreeAndNil() ist für Klassen und entspricht folgendem:
Delphi-Quellcode:
... und das geht bei deinem Record auch nicht...
AObj.Free;
AObj := Nil; /EDIT: trotz Kastens, da keine Alternative zur Lösung geschrieben wurde... |
Re: werden pointer automatisch aus dem Speicher gelöscht?
Zitat:
Edit: Ich lese gerade Muetze1 hats schon geschrieben, DANKESCHÖN! |
Re: werden pointer automatisch aus dem Speicher gelöscht?
Hallo,
noch ein Hinweis zu "vertrauen, dass Delphi den Mist selber löscht". Ab NT (nicht Win98) wird der komplette Speicher beim Beenden des Programms freigegeben, auch wenn du das nicht selber machst. Bie Win9x erzeugst du ne Speicherleiche bis zum Neustart des Rechners. Ich benutze memcheck (google), um Speicherleichen zu finden. Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 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-2025 by Thomas Breitkreuz