Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Destroy <-> Free (https://www.delphipraxis.net/39360-destroy-free.html)

tn249 1. Feb 2005 14:26


Destroy <-> Free
 
Hallo,

hab mal ne grundlegende Frage zu Destroy bzw Free:


1: Also wenn ich ein Objekt von TIniFile freigeben will, dann steht in der doku ich soll das mit free tun


2: bei den Indykomponenten (V9.0) steht in der doku nichts von free, dafür im source von IdHTTP.Destroy FreeandNil (kann man daraus folgern, dass man destroy aufrufen muss um das objekt freizugeben?)


macht das jeder der ne komponente schreibt wie er will(also free oder destroy benutzen)

wie mach ich das wenn ich eigene klasse schreibe am besten(so dass es alle verstehen)

MfG
tn249

mirage228 1. Feb 2005 14:29

Re: Destroy <-> Free
 
Hi,

Du solltest ein Objekt immer über .Free() freigeben.

Denn TObject.Free macht im Prinzip nichts anderes als:

Delphi-Quellcode:
if Self <> nil then
  Self.Destroy
Und .Destroy() kann halt von jeder Klasse überschrieben werden und somit immer eigener Destruktor Code beim freigeben ausgeführt werden.

mfG
mirage228

tn249 1. Feb 2005 14:32

Re: Destroy <-> Free
 
was ist wenn meiner klasse direkt von TObject kommt, ist es dann egal ob ich free oder destroy nehme?

edit: und was macht das fürn sinn wenn die indyleute dann innerhalb von destroy nochmal free(andnil) ausführen???

mirage228 1. Feb 2005 14:39

Re: Destroy <-> Free
 
Zitat:

Zitat von tn249
was ist wenn meiner klasse direkt von TObject kommt, ist es dann egal ob ich free oder destroy nehme?

Es ist halt nicht egal. Wenn Dein Objekt z.B. schon = nil ist, würde beim Aufruf von Free() nicht passieren, während Destroy() dann wahrscheinlich eine Access Violation auslösen würde.

Zitat:

edit: und was macht das fürn sinn wenn die indyleute dann innerhalb von destroy nochmal free(andnil) ausführen???[/
Im Destroy() werden die Destruktoren von den verwenden Objekten mit .Free() (bzw. mit FreeAndNil) aufgerufen. Die Destruktoren dieser Objekte rufen, dann im Endeffekt sowieso Destroy() auf, prüfen aber, ob sie selbst <> nil sind.

mfG
mirage228

tn249 1. Feb 2005 14:43

Re: Destroy <-> Free
 
jetzt hab ichs kapiert danke :wall:

:thumb:

MFG
tn249

sakura 1. Feb 2005 14:50

Re: Destroy <-> Free
 
Fürn die eigentliche Freigabe von Objekten ist es egal, ob man FreeAndNil, Free oder Destroy nimmt. Es hängt auch von der Situation ab. Destroy braucht man meistens nicht, Free ist da vorzuziehen. Hier mal eine Liste wer was tut:
  • Destroy Gibt das Object, für welches Destroy aufgerufen wird frei. Ist die Objekt-Referenz ungültig, bzw. nil, dann gibt es eine Access Violation (AV). Die Originalreferenz des Objektzeigers bleibt erhalten, ist jedoch ungültig.
  • Free Überprüft ob die übergebene Referenz nil ist. Wenn sie nicht nil ist, dann wird Destroy aufgerufen. Ein Großteil der AVs kann dadurch mit einfachsten Mitteln vermieden werden. Die Originalreferenz des Objektzeigers bleibt erhalten, ist jedoch ungültig.
  • FreeAndNil Kopiert die Object-Referenz in eine temporäre Variabel und löscht das Original (auf nil setzen). Dann wird Free aufgerufen. Die Originalreferenz des Objektzeigers ist gelöscht und somit leicht überprüfbar.

Wann nutzt man was. In normalen Anwendungen würde ich immer FreeAndNil empfehlen. Damit können die häufigsten AV-Fehler vermieden werden.

Wenn ein Object andere Objecte referenziert, dann reicht der Aufruf auf Free, um die anderen Objekte freizugeben. Deren Zeiger müssen nicht mehr auf nil gesetzt werden, da das referenzierende Objekt später auch nicht mehr existiert und diese nicht referenziert werden.

In extrem perfomance-saugenden Systemen ist evtl. ein Direktaufruf auf Destroy zu empfehlen, da der Vergleich auf nil sowie ein Extra-Methodenlookup/-sprung vermieden werden kann. Jedoch ist hiervon iA abzuraten, da mann dann immer 100%ig wissen muss, was mit einem Objekt gerade geschieht.

Und nun zu Indy: eigentlich kann es uns egal sein, was die machen. Solange man selbst sauber arbeitet sind deren Methoden nebenranging. Wenn für bestimmte Objekte Destroy empfohlen wird :gruebel: dann macht man es halt, ansonsten sollte man iA FreeAnNil oder Free nutzen.

...:cat:...


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