Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi werden pointer automatisch aus dem Speicher gelöscht? (https://www.delphipraxis.net/74760-werden-pointer-automatisch-aus-dem-speicher-geloescht.html)

alleinherrscher 8. Aug 2006 12:15


werden pointer automatisch aus dem Speicher gelöscht?
 
Hi@all!

Ich hab hier sone Verkettung von Pointern:

Delphi-Quellcode:
 aComputer = ^TElement;
   TElement = record
    aName:String;
    aIP:String;
    aDescription:String;
    aPicture:Tbitmap;
    NextComputer:aComputer;
   end;
Die sind eben immer mit aComputer.NextComputer.NextComputer.... usw. verknüpft.
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?

sakura 8. Aug 2006 12:17

Re: werden pointer automatisch aus dem Speicher gelöscht?
 
Zitat:

Zitat von alleinherrscher
Meine Frage: kann es sein, dass Delphi irgendwie den Pointer selbstständig löscht?

Nein, Dein Fehler muss an anderer Stelle liegen.

...:cat:...

alleinherrscher 8. Aug 2006 12:24

Re: werden pointer automatisch aus dem Speicher gelöscht?
 
Zitat:

Zitat von sakura
Zitat:

Zitat von alleinherrscher
Meine Frage: kann es sein, dass Delphi irgendwie den Pointer selbstständig löscht?

Nein, Dein Fehler muss an anderer Stelle liegen.

...:cat:...

Okay, danke für die schnelle Antwort!!!

RavenIV 8. Aug 2006 12:30

Re: werden pointer automatisch aus dem Speicher gelöscht?
 
Zitat:

Zitat von alleinherrscher
Die sind eben immer mit aComputer.NextComputer.NextComputer.... usw. verknüpft.
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!!!

ist doch klar.
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.

alleinherrscher 8. Aug 2006 12:36

Re: werden pointer automatisch aus dem Speicher gelöscht?
 
Zitat:

Zitat von RavenIV
Zitat:

Zitat von alleinherrscher
Die sind eben immer mit aComputer.NextComputer.NextComputer.... usw. verknüpft.
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!!!

ist doch klar.
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.

Ne, ich hab das Element sozusagen noch in der Hand, pass auf:

folgende Procedure:

Delphi-Quellcode:

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;
Ich hab zwar den Pointer schon aus der Liste rausgenommen, aber die Variable Computer zeigt ja noch auf das Element, oder?

TBx 8. Aug 2006 12:44

Re: werden pointer automatisch aus dem Speicher gelöscht?
 
Du verwendest freeandnil zur Freigabe eines records.
Das geht nicht!

OnlineHilfe gibt folgendes wieder:

Zitat:

FreeAndNil Routine

Gibt eine Objektreferenz frei und ersetzt die Referenz mit nil (Delphi) oder mit NULL (C++).

Unit
SysUtils

Syntax


[Delphi] procedure FreeAndNil(var Obj: Type);


Beschreibung
Mit FreeAndNil stellen Sie sicher, dass eine Variable nach der Freigabe der Objektreferenz nil (Delphi) bzw. NULL (C++) ist. Im Parameter Obj wird eine Variable übergeben, die ein Objekt repräsentiert.
Warnung:
Obj muss eine Instanz einer von TObject abgeleiteten Klasse sein.
Gruß

onlinekater

Muetze1 8. Aug 2006 12:45

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:
AObj.Free;
AObj := Nil;
... und das geht bei deinem Record auch nicht...

/EDIT: trotz Kastens, da keine Alternative zur Lösung geschrieben wurde...

alleinherrscher 8. Aug 2006 12:46

Re: werden pointer automatisch aus dem Speicher gelöscht?
 
Zitat:

Zitat von onlinekater

Du verwendest freeandnil zur Freigabe eines records.
Das geht nicht!

Gruß

onlinekater

Oh, danke! Das wirds wohl sein...dumme Frage, aber: Wie kann ich denn so ein "pointer auf ein Record" bzw ein Record freigeben? oder muss ich das gar nicht, sprich einfach das freeandnil weglassen und darauf vertrauen, das Delphi den mist selber ausm Speicher löscht?

Edit: Ich lese gerade Muetze1 hats schon geschrieben, DANKESCHÖN!

hoika 8. Aug 2006 16:46

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 12:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz