![]() |
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; |
Re: TStringList mit Objekten: Free oder FreeAndNil?
FreeAndNil() setzt zusätzlich zum aufruf von .Free() noch die Referenzvariable für die Stringliste auf Nil.
|
Re: TStringList mit Objekten: Free oder FreeAndNil?
Zitat:
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; |
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] |
Re: TStringList mit Objekten: Free oder FreeAndNil?
Zitat:
Delphi-Quellcode:
entspricht
FreeAndNil(MyStringList);
Delphi-Quellcode:
Damit sollte es klar sein, dass es für die Objekte in der StringList keinen Unterschied macht.
MyStringList.Free;
MyStringList := nil; //Das ist der einzige Unterschied Wie DeddyH schon vorgeschlagen hat: Probiere es aus, wobei ich vermute, dass die Objecte manuell freigegeben werden müssen. |
Re: TStringList mit Objekten: Free oder FreeAndNil?
Zitat:
|
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.
|
Re: TStringList mit Objekten: Free oder FreeAndNil?
Es geht aber um OwnsObjects.
|
Re: TStringList mit Objekten: Free oder FreeAndNil?
Oha. :oops: Immer diese neuen Delphi-Versionen. :mrgreen:
|
Re: TStringList mit Objekten: Free oder FreeAndNil?
Hallo PeterPanino,
Delphi-Quellcode:
(das wird so nicht funktionieren, weil sich Count bei jedem Schleifendurchlauf ändert.)
for i := 0 to MyStringList.Count - 1 do
FreeAndNil(MyStringList.Objects[i]); Sorry, das ist Blödsinn siehe Apollonius.
Delphi-Quellcode:
Bis bald Chemiker
for i := MyStringList.Count-1 downto 0 do
begin FreeAndNil(MyStringList.Objects[i]); end; |
Re: TStringList mit Objekten: Free oder FreeAndNil?
Alternative:
Delphi-Quellcode:
Aber nun wäre es interessant zu wissen, ob man sich diese Gedanken durch das OwnsObjects sparen kann, das wäre ja mal eine sinnvolle Erweiterung.
while MyStringList.Count > 0 do
begin FreeAndNil(MyStringList.Objects[0]); end; |
Re: TStringList mit Objekten: Free oder FreeAndNil?
Ähm, durch das Freigeben des i-ten Objekts wird die Liste nicht kleiner. Das geschieht nur durch Delete oder Remove.
|
Re: TStringList mit Objekten: Free oder FreeAndNil?
Delphi-Quellcode:
destructor TStringList.Destroy;
begin // In the event that we own the Objects make sure to free them all when we // destroy the stringlist. if OwnsObjects then begin for I := 0 to FCount - 1 do GetObject(I).Free; end; |
Re: TStringList mit Objekten: Free oder FreeAndNil?
Apollonius, Du hast recht, völlig vertorft. Aber nachdem ich nun den Source sehe, fühle ich mich bestätigt, die Liste kümmert sich selbst um die Freigabe.
[edit] Nickname falsch geschrieben, sry [/edit] |
Re: TStringList mit Objekten: Free oder FreeAndNil?
Das soll mir eine Lehre sein, um in Zukunft immer zuerst die Primärquellen zu Rate zu ziehen ... ;-)
|
Re: TStringList mit Objekten: Free oder FreeAndNil?
Dafür sind die ja dabei ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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 by Thomas Breitkreuz