AGB  ·  Datenschutz  ·  Impressum  







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

Frage eines Neulings bezüglich 'Free'

Ein Thema von Stefan Hueg · begonnen am 15. Aug 2004 · letzter Beitrag vom 16. Aug 2004
Antwort Antwort
Benutzerbild von Stefan Hueg
Stefan Hueg

Registriert seit: 13. Jun 2004
Ort: Gießen
187 Beiträge
 
Delphi 2006 Professional
 
#1

Frage eines Neulings bezüglich 'Free'

  Alt 15. Aug 2004, 07:31
Ich bin noch recht neu bei Delphi. Ich weiss dass es Constructors gibt, kenne ich von C++ her.

Aber nun stoße ich häufiger auf diese Anweisungen:
Code:
StringList.Free;
Es scheint mir so, als wäre dies der Destruktor. Ich hoffe ich bin da richtig.

Allerdings würde ich gerne wissen wo der Unterschied zu folgendem liegt:
Code:
FreeAndnil(StringList);
Bräuchte da mal ein bisserl Nachhilfe

Danke im Vorraus
Stefan Hueg
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Frage eines Neulings bezüglich 'Free'

  Alt 15. Aug 2004, 08:08
Hi,

du hast doch eine Delphi-Hilfe. Dort kannst du ja mal nach schauen:

Zitat von OnlineHilfe -> Free:
Die Methode Free löst die Instanz eines Objekts auf und gibt nötigenfalls den zugehörigen Speicher frei.

Delphi-Syntax:

procedure Free;

C++ Syntax:

__fastcall Free();

Beschreibung

Mit Free wird ein Objekt freigegeben. Wenn die Objektreferenz nicht nil ist, wird Destroy aufgerufen. Alle zur Laufzeit instantiierten Objekte, die keinen Eigentümer besitzen, sollten mit Free aufgelöst werden, damit sowohl das Objekt als auch der zugehörige Speicher korrekt freigegeben wird. Im Gegensatz zu Destroy funktioniert Free auch dann, wenn das Objekt nil ist. Es ist also kein Fehler, die Methode für ein Objekt aufzurufen, das niemals initialisiert wurde.

Wenn Sie Free für eine Komponente aufrufen, werden alle untergeordneten Objekte (die Einträge in ihrer Komponentenliste) automatisch freigegeben. Da ein Formular der Eigentümer aller Steuerelemente und anderer Komponenten ist, die Sie im Entwurfsmodus hinzugefügt haben, werden diese Komponenten automatisch mit dem Formular freigegeben. Alle Formulare gehören standardmäßig zum Anwendungsobjekt (TApplication) und werden daher zusammen mit diesem aus dem Speicher entfernt. Bei Objekten, die keine Komponenten sind, oder bei mit dem Eigentümer nil erstellten Komponenten muss Free explizit aufgerufen werden, wenn das betreffende Objekt nicht mehr benötigt wird. Der zugewiesene Speicher kann sonst erst nach dem Beenden der Anwendung wieder verwendet werden.

Warnung: Sie dürfen eine Komponente nie in einer ihrer eigenen Ereignisbehandlungsroutinen oder in einer Ereignisbehandlungsroutine eines untergeordneten Objekts freigeben. Geben Sie beispielsweise auf keinen Fall eine Schaltfläche oder ihr übergeordnetes Formular in der OnClick
-Ereignisbehandlungsroutine der Schaltfläche frei.

Um ein Formular freizugeben, ruften Sie seine Methode Release auf. Dadurch wird sichergestellt, dass das Formular erst aus dem Speicher entfernt wird, wenn die Ausführung seiner eigenen und der Ereignisbehandlungsroutinen seiner Komponenten beendet ist.

Geben Sie in C++ keine Objekte mit Free frei. Verwenden Sie stattdessen das Schlüsselwort delete.

Zitat von OnlineHilfe -> FreeAndNil:
Die Prozedur gibt eine Objektreferenz frei und ersetzt die Referenz mit nil (Delphi) oder mit NULL (C++).

Unit

SysUtils

Kategorie

Zeiger und Adressierung

Delphi-Syntax:

procedure FreeAndNil(var Obj);

C++ Syntax:

extern PACKAGE void __fastcall FreeAndNil(void *Obj);

Beschreibung

Mit FreeAndNil stellen Sie sicher, dass eine Variable nach der Freigabe der Objektreferenz nil (Delphi) bzw. NULL (C++) ist. Im Parameter Obj wird eine Variable übergeben, die ein Objekt repräsentiert.

Warnung: Obj muss eine Instanz einer von TObject abgeleiteten Klasse sein.
Zitat von Stefan:
Es scheint mir so, als wäre dies der Destruktor. Ich hoffe ich bin da richtig.
Das ist nicht ganz so richtig. Destroy wäre der Destructor. Aber man sollte besser Free verwenden (siehe Oben).
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Frage eines Neulings bezüglich 'Free'

  Alt 15. Aug 2004, 09:45
Ist ganz einfach.
"Free" ruft wenn die Instanz noch vorhanden ist "Destroy" (den eigentlichen Destructor) auf.
Dabei ist "Destroy" sowie "Free" eine Methode von dem Object.

"FreeAndnil" hingegen ist keine Methode von dem Object sondern eine eigenständige procedure/function welche vermutlich nix anderes macht als "Free" des Objectes auzurufen und danach den Pointer auf "nil" zu setzen
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#4

Re: Frage eines Neulings bezüglich 'Free'

  Alt 15. Aug 2004, 12:31
ja. und zum zerstören zu empfehlen ist wie gesagt "FreeAndNil()", welches, wenn möglich, den Destruktor "Destroy" aufruft, und danach die Veriable auf nil setzt, damit sie nicht mehr dereferenziert werden kann.
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Benutzerbild von Stefan Hueg
Stefan Hueg

Registriert seit: 13. Jun 2004
Ort: Gießen
187 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Frage eines Neulings bezüglich 'Free'

  Alt 15. Aug 2004, 23:14
Oki vielen Dank an euch Also immer brav FreeAndNil aufrufen ^^
Stefan Hueg
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#6

Re: Frage eines Neulings bezüglich 'Free'

  Alt 15. Aug 2004, 23:24
im normalfall schon. aber nur, wenn man das objekt nicht mehr braucht
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#7

Re: Frage eines Neulings bezüglich 'Free'

  Alt 15. Aug 2004, 23:47
Zitat von Stefan Hueg:
Also immer brav FreeAndNil aufrufen ^^
Aber nur dann, wenn es Sinn macht.
Wenn Du zum Beispiel ein Objekt nur innerhalb einer Funktion benutzt, und es am Ende wieder freigibst, dann reicht vollkommen, auf dem Objekt das Free auszuführen, da das Setzen des Wertes auf Nil tatsächlich noch Taktzyklen braucht, die Variable nach dem Verlassen der Methode aber eh ungültig wird: demnach ein Performanceverlust.

Das ist zwar bei einem FreeAndNil() nicht wirklich merkbar, aber wenn das in jeder Methode gemacht wird, und solche Methoden gar noch in einer lang laufenden Schleife aufgerufen werden, dann summiert sich das unter Umständen schonmal merkbar hoch.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#8

Re: Frage eines Neulings bezüglich 'Free'

  Alt 16. Aug 2004, 01:19
ach, halt's maul

^^^^ beachten sie die IRONIE. aber für otto-normalprogger machts keinen unterschied...
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Frage eines Neulings bezüglich 'Free'

  Alt 16. Aug 2004, 02:14
Zitat:
...Es ist also kein Fehler, die Methode [-> Free] für ein Objekt aufzurufen, das niemals initialisiert wurde.
http://visetoolbox.rpgportal.de/imag...p_thinking.gif

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var FS: TStream;
begin
  FS.Free;
end;
Warum gehen die davon aus, dass alle nicht initialisierten Objekte nil sind?
Edit: FS hat hier lustigerweise die gleiche Adresse wie Form1 *g*
Dani H.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Frage eines Neulings bezüglich 'Free'

  Alt 16. Aug 2004, 02:22
FS wird nicht nil sein, aber es wird auch nichts gescheites drinne stehen. Lokale Variablen werden nicht initialisiert, ergo steht in SF irgend ein Schrott drinne und die Prüfung auf <> nil oder muit Delphi-Referenz durchsuchenAssigned liefert True.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 19:35 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