Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free (https://www.delphipraxis.net/80803-unterschied-zwischen-freeandnil-objekt-und-objekt-free.html)

peacemoon 15. Nov 2006 15:10


Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
 
Kann jemand mir erklären, welchen Unterschied gibt es zwischen FreeAndNil(Objekt) und Objekt.Free?

mkinzler 15. Nov 2006 15:11

Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
 
FreeAndNil ist
Delphi-Quellcode:
Objekt.Free;
Objekt := Nil;

pertzschc 15. Nov 2006 15:15

Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
 
Sofern ich es verstanden habe:
Du hast eine Variable die Du mit Create einer Klasse erzeugt hast.

Delphi-Quellcode:
myVar := TMyVar.Create;
Delphi-Quellcode:
myVar.Free
gibt nur den reservierten (und belegten) Speicherbereich frei, auf den myVar zeigt.
Der Zeiger selber hat danach immer noch die Adresse des Speicherbereiches.

Delphi-Quellcode:
FreeAndNil(myVar);
gibt den reservierten (und belegten) Speicherbereich frei und setzt zusätzlich
der Zeiger von myVar auf nil.
Damit kannst Du hinterher sauber mit (myVar = nil) prüfen.

Gruß,
Christoph

semo 15. Nov 2006 15:55

Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
 
zusatz: freeandnil kannst du auch mit einem nicht erzeugten objekt aufrufen ohne das es knallt, sprich du musst vorher nicht auf nil prüfen umd das objekt freizugeben

hoika 15. Nov 2006 16:49

Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
 
Hallo,

Vorsicht mit solchen Behauptungen.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  Button: TButton;
begin
  FreeAndNIL(Button); // Schutzverletzung !
end;
Was du meintest war, dass .Free auch bei NIL-Objekten klappt.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  Button: TButton;
begin
  Button:= NIL;
  Button.Free; // OK
end;
Was das etwas undurchsichtig macht ist, dass Klassenvariablen
automatisch initialisiert werden, Zeiger und damit auch Objekte also z.B. NIL sind.

Das FreeAndNIL ist einfach die Zusammenfassung von 2 Befehlen.


Heiko

Khabarakh 15. Nov 2006 16:53

Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
 
Zitat:

Zitat von computer-glossar.de
zusatz: freeandnil kannst du auch mit einem nicht erzeugten objekt aufrufen ohne das es knallt, sprich du musst vorher nicht auf nil prüfen umd das objekt freizugeben

Nope, das ist schon in Free eingebaut.

[edit]
Zitat:

Zitat von hoika
Schutzverletzung !

Muss nicht sein, vermeiden sollte man solchen Code trotzdem ;) .
[/edit]

SirThornberry 15. Nov 2006 16:55

Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
 
Zitat:

Zitat von Khabarakh
Zitat:

Zitat von computer-glossar.de
zusatz: freeandnil kannst du auch mit einem nicht erzeugten objekt aufrufen ohne das es knallt, sprich du musst vorher nicht auf nil prüfen umd das objekt freizugeben

Nope, das ist schon in Free eingebaut.

[edit]
Zitat:

Zitat von hoika
Schutzverletzung !

Muss nicht sein, vermeiden sollte man solchen Code trotzdem ;) .
[/edit]

Jein, es geht nich darum das es nihct erzeugt sein muss sondern darum das die Instanzvariable nil ist.

Khabarakh 15. Nov 2006 17:00

Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
 
Hm? Ob das Objekt instanziiert wurde, kann weder Free noch FreeAndNil erkennen. Sie können nur den Pointer auf nil prüfen, aber das machen eben beide.
Man könnte höchstens sagen, dass bei einem Aufruf von FreeAndNil ein weiteres Free(AndNil) nicht fehlschlagen wird.

jbg 15. Nov 2006 17:55

Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
 
Zitat:

Zitat von Khabarakh
Man könnte höchstens sagen, dass bei einem Aufruf von FreeAndNil ein weiteres Free(AndNil) nicht fehlschlagen wird.

Sofern die Variable nicht aus ihrem Sichtbarkeitsbereich (scope) tritt und somit nicht mehr erreichbar ist. Für lokale Variablen ist FreeAndNil z.B nicht notwendig, wenn zu einem späteren Zeitpunkt in der Funktion nicht mehr auf diese Variable zugegriffen wird. Man kann es nämlich mit FreeAndNil auch übertreiben, wie es bei den Indy-Komponenten der Fall ist.

pertzschc 15. Nov 2006 18:06

Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
 
Zitat:

Zitat von jbg
Für lokale Variablen ist FreeAndNil z.B nicht notwendig, wenn zu einem späteren Zeitpunkt in der Funktion nicht mehr auf diese Variable zugegriffen wird.

Wie meinst Du das? Wird das .Free einer lokales Variable am Ende der Prozedur automatisch aufgerufen oder wird nur der Zeiger auf nil gesetzt?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:00 Uhr.
Seite 1 von 3  1 23      

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