Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#3

Re: Freigabe von Objekten, die in einer TObjectList stecken

  Alt 30. Mär 2007, 18:22
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]
  Mit Zitat antworten Zitat