Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Frage eines Neulings bezüglich 'Free' (https://www.delphipraxis.net/27745-frage-eines-neulings-bezueglich-free.html)

Stefan Hueg 15. Aug 2004 06:31


Frage eines Neulings bezüglich 'Free'
 
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

Die Muhkuh 15. Aug 2004 07:08

Re: Frage eines Neulings bezüglich 'Free'
 
Hi,

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

Zitat:

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:

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:

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).

SirThornberry 15. Aug 2004 08:45

Re: Frage eines Neulings bezüglich 'Free'
 
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

nailor 15. Aug 2004 11:31

Re: Frage eines Neulings bezüglich 'Free'
 
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.

Stefan Hueg 15. Aug 2004 22:14

Re: Frage eines Neulings bezüglich 'Free'
 
Oki vielen Dank an euch :) Also immer brav FreeAndNil aufrufen ^^

nailor 15. Aug 2004 22:24

Re: Frage eines Neulings bezüglich 'Free'
 
im normalfall schon. aber nur, wenn man das objekt nicht mehr braucht

Phoenix 15. Aug 2004 22:47

Re: Frage eines Neulings bezüglich 'Free'
 
Zitat:

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.

nailor 16. Aug 2004 00:19

Re: Frage eines Neulings bezüglich 'Free'
 
:mrgreen: ach, halt's maul :mrgreen:

^^^^ beachten sie die IRONIE. aber für otto-normalprogger machts keinen unterschied...

Dani 16. Aug 2004 01:14

Re: Frage eines Neulings bezüglich 'Free'
 
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? :gruebel:
Edit: FS hat hier lustigerweise die gleiche Adresse wie Form1 *g*

Luckie 16. Aug 2004 01:22

Re: Frage eines Neulings bezüglich 'Free'
 
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.


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