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 TObjectlist -> OwnsObjects -> FastMM4. Frage zur freigabe (https://www.delphipraxis.net/142518-tobjectlist-ownsobjects-fastmm4-frage-zur-freigabe.html)

Jackie1983 29. Okt 2009 16:30


TObjectlist -> OwnsObjects -> FastMM4. Frage zur freig
 
Servus

ich habe zwei klassen.
Delphi-Quellcode:
  TTestKlasse1 = class(TObject)
    var1 : string;
    var2 : integer;
    list : TObjectlist;
    Constrcutor Create; //<- erstellt list
    Destructor Free; //<- freigeben list
  end;

  TTestklasse2 = class(TObject)
    list2 : TObjectlist;
    Constrcutor Create; //<- erstellt list2, list2.OwnsObjects := true
    Destructor Free; //<- freigeben list2.free
  end;
Die klasse TTestklasse2 wird erstellt. In list füge ich ein paar Objekte von TTestKlasse1 hinzu.

Wenn ich jetzt das free von TTestklasse2 aufrufe und dort nur schreibe list2.free sind die listen aus der TTestKlass noch vorhanden laut FastMM4. Habe ich zum Beispiel TTestKlasse1 10 mal hinzugefügt habe ich 10 TObjectlist als speicherfresser.

Muss ich doch die list2 durchgehen und dann für jedes objekt free aufrufen so das die objektlist freigegeben wird?

Mfg

shmia 29. Okt 2009 16:35

Re: TObjectlist -> OwnsObjects -> FastMM4. Frage zur f
 
Falsch:
Delphi-Quellcode:
destructor Free;
Richtig:
Delphi-Quellcode:
destructor Destroy;override;
Niemals das Override beim Destructor vergessen!!!
Niemals vergessen im Destructor inherited aufzurufen!!!
Delphi-Quellcode:
destructor TTestKlasse1.Destroy
begin
   list.Free;
   inherited; // immer letzte Anweisung im Destructor
end;

Jackie1983 29. Okt 2009 16:48

Re: TObjectlist -> OwnsObjects -> FastMM4. Frage zur f
 
super, danke.

Jackie1983 29. Okt 2009 17:41

Re: TObjectlist -> OwnsObjects -> FastMM4. Frage zur f
 
dann habe ich aber noch ne frage, was soll am besten verwendet werden?
Habe in alle klassen oder objekte die ich freigebe immer free benutzt noch nie destroy.

Wo benutze ich jetzt was?

DeddyH 29. Okt 2009 17:54

Re: TObjectlist -> OwnsObjects -> FastMM4. Frage zur f
 
Wenn Du eine Klasse ableitest, überschreibst Du den Destruktor namens Destroy. Zum Freigeben von Objekten benutzt Du Free bzw. FreeAndNil.

sx2008 29. Okt 2009 20:01

Re: TObjectlist -> OwnsObjects -> FastMM4. Frage zur f
 
Free macht gegenüber Destroy eine zusätzliche Prüfung:
Delphi-Quellcode:
procedure TObject.Free; // aus Unit System
begin
  if Self <> nil then
    Destroy;
end;
Man darf also Free auch dann aufrufen, wenn das Objekt gar nicht existiert.

DeddyH 29. Okt 2009 20:17

Re: TObjectlist -> OwnsObjects -> FastMM4. Frage zur f
 
Sofern die Referenz ge"nil"t wurde, sonst kracht es trotzdem.

Jackie1983 30. Okt 2009 05:41

Re: TObjectlist -> OwnsObjects -> FastMM4. Frage zur f
 
ok verstanden, thx

Jackie1983 30. Okt 2009 07:03

Re: TObjectlist -> OwnsObjects -> FastMM4. Frage zur f
 
aber noch ein kleines Problem habe ich. Habe jetzt alle meine Speicherfresser gefunden und beseitigt, es waren bestimmt 40 :wink:

Wenn ich eine Klasse habe die von TThread abgeleitet wurde und ich rufe bei der klasse FreeAndNil(MeinThread) auf bleibt er im Destroy bei inherited stehen. Bestimmt habe ich was vergessen, nur was :?:

Blup 30. Okt 2009 07:29

Re: TObjectlist -> OwnsObjects -> FastMM4. Frage zur f
 
Der Destructor von TThread ruft intern Terminate auf, dadurch wird Terminated auf True gesetzt.
Anschließend wartet er bis der Thread beendet wurde.

Deine Aufgabe ist es im Execute des Threads regelmäßig Terminated zu prüfen und die Methode wenn erforderlich zu verlassen.


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