Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Freigabe von Objekten, die in einer TObjectList stecken (https://www.delphipraxis.net/89412-freigabe-von-objekten-die-einer-tobjectlist-stecken.html)

Glühwürmchen 30. Mär 2007 17:12


Freigabe von Objekten, die in einer TObjectList stecken
 
Der Titel sagt es nicht ganz korrekt:

Ich habe in Unit 1 folgende Zeilen:
Code:
msg := TLbXmlMessage.Create(lbmsg.xmlmessage.GetXml);
und
Code:
_AktuellesFahrzeug.AddAktuellenSchraubdatensatz(msg);
"AddAktuellenSchraubdatensatz" ist eine Methode von Unit2, die das Object einer TObjectList hinzufügt.

Was passiert jetzt, wenn ich das Object "msg" in Unit 1 mit "FreeAndNil" o.ä. wieder freigebe?

Zeigt dann der entsprechende Eintrag der ObjectListe in Unit 2 ins Nirvana?

Jelly 30. Mär 2007 17:17

Re: Freigabe von Objekten, die in einer TObjectList stecken
 
Zitat:

Zitat von Glühwürmchen
Zeigt dann der entsprechende Eintrag der ObjectListe in Unit 2 ins Nirvana?

Klares Ja. Und umgekehrt: Wenn du die ObjectList freigibts, so werden standardmässig alle enthaltenen Objekte mit freigegeben.

Der_Unwissende 30. Mär 2007 17:22

Re: Freigabe von Objekten, die in einer TObjectList stecken
 
Zitat:

Zitat von Glühwürmchen
D
Was passiert jetzt, wenn ich das Object "msg" in Unit 1 mit "FreeAndNil" o.ä. wieder freigebe?

Zeigt dann der entsprechende Eintrag der ObjectListe in Unit 2 ins Nirvana?

Nein das tut er nicht.Ja, tut er (siehe Edit). Du speicherst in der TObjectList einen Verweis auf ein Objekt (eine Referenz). Dabei kopierst Du nun den Verweis in eine neue Variable. Der Aufruf von FreeAndNil entspricht (ungefähr) folgendem:
Delphi-Quellcode:
  msg.Free;
  msg := nil;
Dabei wird das Objekt, dass sowohl von msg als auch in der TObjectList referenziert wird freigegeben. Danach wird aber nur die Referenz msg auf nil gesetzt. Davon bekommt aber die andere Variable nichts mit. Diese zeigt weiterhin dorthin, wo einst das Objekt stand, das nun aber schon frei gegeben wurde (also in einen zufällig belegten, ungülitgen Speicherbereich).

Sauberer ist es, wenn Du einfach nicht (unnötig) eine Instanz an mehreren Stellen verwaltest. Du solltest entweder festlegen, dass die TObjectList die Objekte wieder frei gibt oder eben sicherstellen, dass jedes Objekt vor seiner Freigabe aus der TObjectList entfernt wird (es wird nur der Verweis auf das Objekt entfernt!).
So würde z.B. ein msg := nil nur dazu führen, dass msg nicht mehr auf das entsprechende Objekt verweist, der Verweis in der TObjectList wäre aber noch gültig!

Gruß Der Unwissende

[Edit]
Was ist denn mit dem roten Kasten los?!

Jedenfalls hat Jelly Recht, bin heute nicht ganz fit, sorry! Dachte irgendwie, dass Du meintest der würde auf nil zeigen, nur wenn Du das gemeint hättest, hättest Du es wohl auch geschrieben...[/Edit]

Glühwürmchen 30. Mär 2007 21:02

Re: Freigabe von Objekten, die in einer TObjectList stecken
 
Alles klar, danke Jungs.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:42 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