AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Objekte mit Free freigeben

Ein Thema von CalganX · begonnen am 2. Sep 2002 · letzter Beitrag vom 2. Sep 2002
Antwort Antwort
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#1

Objekte mit Free freigeben

  Alt 2. Sep 2002, 13:20
Hi!
Muss man eigentlich Objekte, wie z.B. TIniFile oder TBitmap mit Free wieder freigeben, oder kann man das auslassen?

Chris
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 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)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3
  Alt 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.")
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#4
  Alt 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
  Mit Zitat antworten Zitat
Udontknow

Registriert seit: 17. Jun 2002
223 Beiträge
 
#5
  Alt 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,
Udontknow
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:01 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