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 Objectlist rekursiv free? (https://www.delphipraxis.net/156152-objectlist-rekursiv-free.html)

moelski 22. Nov 2010 07:14

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?

mleyen 22. Nov 2010 07:19

AW: Objectlist rekursiv free?
 
Les dir am besten noch einmal die Hilfe zu Delphi-Referenz durchsuchenOwnsObjects durch.

moelski 22. Nov 2010 07:29

AW: Objectlist rekursiv free?
 
Moin !

Du hast Recht.
Oh Mann schon das zweite Mal über diese "Falle" gestolpert :oops:

Danke jedenfalls.

moelski 22. Nov 2010 08:27

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;

Sir Rufo 22. Nov 2010 09:19

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:
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;
Und hierzu
Delphi-Quellcode:
for I := List.Count - 1 downto 0 do begin
sei folgendes gesagt:
Der Compiler entscheidet ob vorwärts oder rückwärts gezählt wird, somit kann auch dieses hier in die Hose gehen

moelski 22. Nov 2010 09:59

AW: Objectlist rekursiv free?
 
Moin Rufo,

Zitat:

aber jemand anders kümmert sich um das Freigeben.
Das versuche ich ja eben.

Delphi-Quellcode:
TForm1.FormDestroy
Das ich derzeit den Aufruf von hier starte ist im Moment rein für den Test gedacht.

Was wäre denn eine bessere Variante Objekte freizugeben die nicht einer ObjectList gehören?

shmia 22. Nov 2010 10:33

AW: Objectlist rekursiv free?
 
Zitat:

Zitat von moelski (Beitrag 1063216)
Was wäre denn eine bessere Variante Objekte freizugeben die nicht einer ObjectList gehören?

Um was für eine Art von Objekten handelt es sich denn?
Ich frage hier nach den Namen der Klassen.

chaosben 22. Nov 2010 10:35

AW: Objectlist rekursiv free?
 
OT:
Zitat:

Zitat von Sir Rufo (Beitrag 1063211)
Und hierzu
Delphi-Quellcode:
for I := List.Count - 1 downto 0 do begin
sei folgendes gesagt:
Der Compiler entscheidet ob vorwärts oder rückwärts gezählt wird, somit kann auch dieses hier in die Hose gehen

Das ist doch ein Scherz, oder? Wenn nicht, würde ich das gern in einem neuen Thread besprechen.

Neutral General 22. Nov 2010 10:37

AW: Objectlist rekursiv free?
 
Zitat:

Zitat von chaosben (Beitrag 1063221)
OT:
Zitat:

Zitat von Sir Rufo (Beitrag 1063211)
Und hierzu
Delphi-Quellcode:
for I := List.Count - 1 downto 0 do begin
sei folgendes gesagt:
Der Compiler entscheidet ob vorwärts oder rückwärts gezählt wird, somit kann auch dieses hier in die Hose gehen

Das ist doch ein Scherz, oder? Wenn nicht, würde ich das gern in einem neuen Thread besprechen.

Ist beides nicht ganz korrekt. Der Compiler zählt nur rückwärts, wenn es keinen Unterschied macht ob die Schleife vorwärts oder rückwärts läuft (weils schneller ist). In diesem Fall gibt es nichts zu befürchten. Die Schleifen würde immer rückwärts laufen.

chaosben 22. Nov 2010 10:41

AW: Objectlist rekursiv free?
 
Danke. :)


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