![]() |
TObjectlist -> OwnsObjects -> FastMM4. Frage zur freig
Servus
ich habe zwei klassen.
Delphi-Quellcode:
Die klasse TTestklasse2 wird erstellt. In list füge ich ein paar Objekte von TTestKlasse1 hinzu.
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; 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 |
Re: TObjectlist -> OwnsObjects -> FastMM4. Frage zur f
Falsch:
Delphi-Quellcode:
Richtig:
destructor Free;
Delphi-Quellcode:
Niemals das Override beim Destructor vergessen!!!
destructor Destroy;override;
Niemals vergessen im Destructor inherited aufzurufen!!!
Delphi-Quellcode:
destructor TTestKlasse1.Destroy
begin list.Free; inherited; // immer letzte Anweisung im Destructor end; |
Re: TObjectlist -> OwnsObjects -> FastMM4. Frage zur f
super, danke.
|
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? |
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.
|
Re: TObjectlist -> OwnsObjects -> FastMM4. Frage zur f
Free macht gegenüber Destroy eine zusätzliche Prüfung:
Delphi-Quellcode:
Man darf also Free auch dann aufrufen, wenn das Objekt gar nicht existiert.
procedure TObject.Free; // aus Unit System
begin if Self <> nil then Destroy; end; |
Re: TObjectlist -> OwnsObjects -> FastMM4. Frage zur f
Sofern die Referenz ge"nil"t wurde, sonst kracht es trotzdem.
|
Re: TObjectlist -> OwnsObjects -> FastMM4. Frage zur f
ok verstanden, thx
|
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 :?: |
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 23:54 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