![]() |
Delphi-Version: 2010
Objectlist rekursiv free?
Liste der Anhänge anzeigen (Anzahl: 1)
Moin !
Habe da eine Objektliste die ich mit Objektinstanzen fülle. Diese Objektinstanzen haben wiederum eine Property "Subitems" welches dann wieder eine TObjectList ist. Damit kann man verschachtelte Objektstrukturen erzeugen. Funzt auch soweit. Wenn ich nun aber "ReportMemoryLeaksOnShutdown := True" setze, dann bekomme ich Leaks. Ich habe mal eine kleine Testanwendung zusammengestochert die das verdeutlicht. -> Siehe Anhang. FreeAndNil(TestList) bewirkt nur ein Free für die Objekte die in TestList vorhanden sind. Ich hätte erwartet das die SubItems (property ITEM_SubItems : TObjectList) auch ein Free erfahren. Dem ist aber nicht so :( Muss ich jetzt wirklich rekursiv durch meine Objektlisten und überall ein Free aufrufen oder gibt es für TObjectList einen Automatismus der alle SubItems gleich mit zieht? |
AW: Objectlist rekursiv free?
Les dir am besten noch einmal die Hilfe zu
![]() |
AW: Objectlist rekursiv free?
Moin !
Du hast Recht. Oh Mann schon das zweite Mal über diese "Falle" gestolpert :oops: Danke jedenfalls. |
AW: Objectlist rekursiv free?
Nur der Vollständigkeit halber ...
So klappts dann auch mit dem rekursiven Free:
Delphi-Quellcode:
procedure FreeLists(List : TObjectList);
var I : Integer; Pi : TPI_Root; SubList : TObjectList; begin for I := List.Count - 1 downto 0 do begin SubList := TPI_Root(List.Items[I]).ITEM_SubItems; if SubList.Count > 0 then FreeLists(SubList); Pi := TPI_Root(List[i]); List.Delete(I); if List.OwnsObjects = False then Pi.Free; end; end; procedure TForm1.FormDestroy(Sender: TObject); begin FreeLists(TestList); TestList.Free; end; |
AW: Objectlist rekursiv free?
Das was du da machst ist irgendwie völlig sinnentleert.
Wenn ich eine ObjectList habe und setze OwnsObjects auf True, dann signalisiere ich: Ja, diese Liste kümmert sich irgendwann um das Entfernen aus dem Speicher. Ist OwnsObjects auf False, dann heißt das, das die Objekte hier zwar aufgeführt werden, aber jemand anders kümmert sich um das Freigeben. Was du hier machst, ist einen Designfehler in deiner Anwendung zu beheben und kann auch zu einem Zugriffsfehler führen.
Delphi-Quellcode:
Und hierzu
OList1 := TObjectList.Create( True );
OList2 := TObjectList.Create( False ); Obj := TFooObj.Create; OList1.Add( Obj ); OList2.Add( Obj ); for Obj in OList do begin OList2.Remove( Obj ); if not OList2.OwnsObjects then Obj.Free; // Jetzt rummst es, da das Objekt OList1 gehört end;
Delphi-Quellcode:
sei folgendes gesagt:
for I := List.Count - 1 downto 0 do begin
Der Compiler entscheidet ob vorwärts oder rückwärts gezählt wird, somit kann auch dieses hier in die Hose gehen |
AW: Objectlist rekursiv free?
Moin Rufo,
Zitat:
Delphi-Quellcode:
Das ich derzeit den Aufruf von hier starte ist im Moment rein für den Test gedacht.
TForm1.FormDestroy
Was wäre denn eine bessere Variante Objekte freizugeben die nicht einer ObjectList gehören? |
AW: Objectlist rekursiv free?
Zitat:
Ich frage hier nach den Namen der Klassen. |
AW: Objectlist rekursiv free?
OT:
Zitat:
|
AW: Objectlist rekursiv free?
Zitat:
|
AW: Objectlist rekursiv free?
Danke. :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 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-2025 by Thomas Breitkreuz