AGB  ·  Datenschutz  ·  Impressum  







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

Destroy <-> Free

Ein Thema von tn249 · begonnen am 1. Feb 2005 · letzter Beitrag vom 1. Feb 2005
Antwort Antwort
Benutzerbild von tn249
tn249

Registriert seit: 18. Jan 2004
Ort: München
164 Beiträge
 
Delphi 2005 Personal
 
#1

Destroy <-> Free

  Alt 1. Feb 2005, 14:26
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
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Destroy <-> Free

  Alt 1. Feb 2005, 14:29
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von tn249
tn249

Registriert seit: 18. Jan 2004
Ort: München
164 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Destroy <-> Free

  Alt 1. Feb 2005, 14:32
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???
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Destroy <-> Free

  Alt 1. Feb 2005, 14:39
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von tn249
tn249

Registriert seit: 18. Jan 2004
Ort: München
164 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Destroy <-> Free

  Alt 1. Feb 2005, 14:43
jetzt hab ichs kapiert danke



MFG
tn249
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Destroy <-> Free

  Alt 1. Feb 2005, 14:50
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 dann macht man es halt, ansonsten sollte man iA FreeAnNil oder Free nutzen.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  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 06:25 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