Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStringList mit Objekten: Free oder FreeAndNil? (https://www.delphipraxis.net/142625-tstringlist-mit-objekten-free-oder-freeandnil.html)

PeterPanino 31. Okt 2009 12:41


TStringList mit Objekten: Free oder FreeAndNil?
 
In einer TStringList mit OwnsObjects: Werden mit FreeAndNil auch die Objekte der Listenelemente freigegeben, oder reicht dazu Free aus?

Delphi-Quellcode:
MyStringList := TStringList.Create;
MyStringList.OwnsObjects := True;
try
  while DerTagLangIst do
    MyStringList.AddObject(AString, TMyObj.Create);
finally
  //MyStringList.Free;
  FreeAndNil(MyStringList); // besser?
end;

mkinzler 31. Okt 2009 12:43

Re: TStringList mit Objekten: Free oder FreeAndNil?
 
FreeAndNil() setzt zusätzlich zum aufruf von .Free() noch die Referenzvariable für die Stringliste auf Nil.

PeterPanino 31. Okt 2009 12:59

Re: TStringList mit Objekten: Free oder FreeAndNil?
 
Zitat:

Zitat von mkinzler
FreeAndNil() setzt zusätzlich zum aufruf von .Free() noch die Referenzvariable für die Stringliste auf Nil.

Danke, genau das steht auch in der Onlinehilfe. Werden die Objekte der Listenelemente (MyObj) bei MyStringList.Free bzw. FreeAndNil(MyStringList) auch freigegeben oder muss man die vorher "manuell" freigeben?

Etwa so?:

Delphi-Quellcode:
MyStringList := TStringList.Create;
MyStringList.OwnsObjects := True;
try
  while DerTagLangIst do
    MyStringList.AddObject(AString, TMyObj.Create);
finally
  for i := 0 to MyStringList.Count - 1 do
    FreeAndNil(MyStringList.Objects[i]);

  //MyStringList.Free;
  FreeAndNil(MyStringList); // besser?
end;

DeddyH 31. Okt 2009 12:59

Re: TStringList mit Objekten: Free oder FreeAndNil?
 
Mein Delphi 2007 kennt zwar noch kein OwnsObjects bei Stringlisten, aber ich mutmaße einmal, dass es sich so verhält wie bei einer TObjectlist, d.h. beim Freigeben der Liste werden auch die enthaltenen Objekte "entsorgt".

[edit] Um sicherzugehen kannst Du Dir doch einmal eine Testanwendung schreiben und ReportMemoryLeaksOnShutdown auf true setzen. Wenn ohne manuelle Freigabe keine Speicherlecks gemeldet werden, habe ich wohl recht. [/edit]

guidok 1. Nov 2009 11:43

Re: TStringList mit Objekten: Free oder FreeAndNil?
 
Zitat:

Zitat von PeterPanino
Werden die Objekte der Listenelemente (MyObj) bei MyStringList.Free bzw. FreeAndNil(MyStringList) auch freigegeben oder muss man die vorher "manuell" freigeben?

Delphi-Quellcode:
  FreeAndNil(MyStringList);
entspricht

Delphi-Quellcode:
  MyStringList.Free;
  MyStringList := nil; //Das ist der einzige Unterschied
Damit sollte es klar sein, dass es für die Objekte in der StringList keinen Unterschied macht.

Wie DeddyH schon vorgeschlagen hat: Probiere es aus, wobei ich vermute, dass die Objecte manuell freigegeben werden müssen.

DeddyH 1. Nov 2009 12:56

Re: TStringList mit Objekten: Free oder FreeAndNil?
 
Zitat:

Zitat von guidok
wobei ich vermute, dass die Objecte manuell freigegeben werden müssen.

Welchen Sinn sollte die Property aber dann haben?

Apollonius 1. Nov 2009 14:13

Re: TStringList mit Objekten: Free oder FreeAndNil?
 
Meiner Erinnerung zufolge gibt die TStringList die Objekte nicht frei. Der Sinn hinter dem Objects-Konstrukt ist schlicht, dass man ein Dictionary aufbauen kann. Bei der TListBox z.B. finde ich es sehr nützlich, zu jedem Eintrag noch Nutzdaten hinterlegen zu können.

DeddyH 1. Nov 2009 15:10

Re: TStringList mit Objekten: Free oder FreeAndNil?
 
Es geht aber um OwnsObjects.

Apollonius 1. Nov 2009 15:17

Re: TStringList mit Objekten: Free oder FreeAndNil?
 
Oha. :oops: Immer diese neuen Delphi-Versionen. :mrgreen:

Chemiker 1. Nov 2009 16:31

Re: TStringList mit Objekten: Free oder FreeAndNil?
 
Hallo PeterPanino,

Delphi-Quellcode:
for i := 0 to MyStringList.Count - 1 do
    FreeAndNil(MyStringList.Objects[i]);
(das wird so nicht funktionieren, weil sich Count bei jedem Schleifendurchlauf ändert.)
Sorry, das ist Blödsinn siehe Apollonius.

Delphi-Quellcode:
for i := MyStringList.Count-1 downto 0 do
begin
  FreeAndNil(MyStringList.Objects[i]);
end;
Bis bald Chemiker


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:09 Uhr.
Seite 1 von 2  1 2      

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