Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Objekte mit Free freigeben (https://www.delphipraxis.net/755-objekte-mit-free-freigeben.html)

CalganX 2. Sep 2002 13:20


Objekte mit Free freigeben
 
Hi!
Muss man eigentlich Objekte, wie z.B. TIniFile oder TBitmap mit Free wieder freigeben, oder kann man das auslassen?

Chris

Christian Seehase 2. Sep 2002 13:32

Moin Chris,

grundsätzlich gilt:
Alle Resourcen, die man belegt müssen auch wieder freigegeben werden.
I.d.R. durch die Verwendung von try/finally ggf. try/except, OnCreate/OnDestroy oder initialization/finalization (je nachdem) sicherzustellen.

Ob dies nun direkt geschehen muss, wie z.B. bei TBitmap, oder auch indirekt, wie z.B. bei einem zur Laufzeit erzeugten TTabsheet spielt keine Rolle.
(Bei TTabsheet wird ja üblicher Weise ein Owner angegeben, so dass das Tabsheet wieder freigegeben wird, sobald der Owner freigeben wird)

jbg 2. Sep 2002 13:38

Ja, man muss diese mit Free freigeben, denn sonst hat man ein Speicherleck und der Arbeitsseicher geht dann irgendwann mal aus (kann zwar dauern, aber beim einem Bitmap mit 10000x10000 wird es schneller gehen).

Bei Komponenten kann man es theoretisch weglassen, wenn man eine Komponente so erzeugt:
Code:
MyComp := TMyComp.Create([u]Self[/u]);
Denn dadurch ist Self (-> das Formular) der Besitzer (Owner) der Komponente, und wenn das Formular dann freigegeben wird, was von Delphi geregelt wird, dann wird auch die Komponente freigegeben, sollte sie nicht zuvor mit .Free freigegeben worden sein.
Es zählt aber zu einem schlechten Programmierstiel, wenn man den belegten Speicher nicht selbst wieder freigibt.
("Zu jedem Create gehört auch ein passendes Free.")

CalganX 2. Sep 2002 13:56

Das würde heißen, wenn ich mainFile als private von TForm1 mache, dass ich dass dann weglassen könte, oder?

Chris

Udontknow 2. Sep 2002 14:29

Private-Deklaration haben mit dem Erzeugen und Freigeben von Objekten nichts zu tun! Wenn du etwas als private deklarierst, können andere Objekte nicht darauf zugreifen, nur das dieses Objekt beinhaltende Objekt hat Zugriff (siehe Aggregation).

Zunächst: Die automatische Freigabe durch den Owner ist nur bei Komponenten( genauer gesagt: Nachfahren der Klasse TComponent) möglich.

Ob du nun deine Komponente im private, public, oder published-Bereich deklarierst, ist für die Freigabe völlig unerheblich. Du könntest theoretisch sogar Komponenten, die in anderen Formularen deklariert sind, automatisch freigeben lassen:
Code:
form2.meineKomponente:=TMeineKomponente.Create(form1);
Damit würde, sobald Form1 freigegeben wird, automatisch auch MeineKomponente freigegeben, obwohl diese in einem völlig anderen Teil deines Programmes deklariert ist.

Instanzen der Klasse TIniFile stammen nicht von TComponent ab, mit ihnen ist so etwas also nicht möglich, sie müssen manuell freigegeben werden.

Cu, :D
Udontknow


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:12 Uhr.

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