Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Free oder FreeAndNil= (https://www.delphipraxis.net/139353-free-oder-freeandnil%3D.html)

Pilloker 27. Aug 2009 08:25


Free oder FreeAndNil=
 
Hallo,

ich weiß nicht, wann ich INSTANZ.Free aufrufen muss, und wann FreeAndNil(INSTANZ).
Wer kann es mir erklären?

Danke.

mkinzler 27. Aug 2009 08:29

Re: Free oder FreeAndNil=
 
Object.Free() gibt das Objekt frei. Die Referenzvariable verweist aber immer noch auf den Speicher des Objekts. FreeAndNil() setzt diese zusätzlich aug Nil

QuickAndDirty 27. Aug 2009 08:40

Re: Free oder FreeAndNil=
 
Wobei zu berücksichtigen ist das FREEANDNIL
Probleme machen kann wenn man die von Delphi automatisch erstellten Formular Variablen
nutzte um in einem Close oder Destroy oder Hide Event des Formulars auf das Formular zuzugreifen.
Also anstelle von Self.

Aphton 27. Aug 2009 08:41

Re: Free oder FreeAndNil=
 
Im Großen und Ganzen - dann, wenn du das Objekt auf <> NIL checkst. Also falls ein paar deiner Funktionen solche checks haben, wirds Fehler geben, falls die Instanz schon zerstört wurde.

Delphi-Quellcode:
var
  X: TControl;
begin
  X        := TControl.Create( Self );
  X.Parent := Self;
  Randomize;
  case Random(2) of
    0: X.Free;
  else
    FreeAndNil( X );
  end;
  if Assigned( X ) then // #1#
    X.Free;
#1#: Falsl bei der zuvorigen case Abfrage 0 das Ergebnis war, dann wurde das Objekt nur zerstört, die Variable X enthält jedoch noch die Adresse. Somit schlägt Assigned fehl, da es auf NIL prüft ... wohingegen FreeAndNil wie schon gesagt wurde, die Variable nach dem Zerstören auch auch NIL setzt.

MfG

mleyen 27. Aug 2009 08:42

Re: Free oder FreeAndNil=
 
FreeAndNil() sollte immer dann aufgerufen werden, wenn das übergebene Objekt weiterhin benutz wird.
Dadurch kann man prüfen, ob das Objekt noch existiert (<> nil) oder schon freigegeben wurde. (= nil)

Wenn du z.B. im Destruktor TObject.Free() aufrufst, macht das (meists) nichts aus, da das Objekt nicht weiter benutzt wird.

Pilloker 27. Aug 2009 09:31

Re: Free oder FreeAndNil=
 
Also kann man sagen, dass es generell in Ordnung ist, wenn man stets FreeAndNil aufruft (den Punkt von
QuickAndDirty mal ausgenommen)?

mleyen 27. Aug 2009 09:38

Re: Free oder FreeAndNil=
 
Ja, kann man sagen.
Der einzigste Unterschied der mir gerade einfällt:
Die Objekt-Referenz muss immer schreibbar sein. (Übergebe als var-Parameter)
Z.B. bei property-Objekten ohne setter dürfte das dann nicht funktionieren.

Edit #1:
Und es muss natürlich die Unit SysUtils mit eingebunden sein, was nicht immer gewünscht ist.

hoika 27. Aug 2009 09:41

Re: Free oder FreeAndNil=
 
Hallo,

nun ja, das NIL-Setzen kostet "etwas" Zeit.

Was man sagen kann, dass dort wo Free aufgerufen wird,
ein FreeAndNIL auch OK ist.

Die Erklärungen waren doch einleuchtend, oder ?

Benutze ich eine Variable mehrfach, gebe Sie dabei immer wieder zwischendurch frei,
kann ich durch Nutzung von FreeAndNIL zwischendurch prüfen,
ob sie aktuell in Benutzung ist, oder nicht.

1. Code.-Bsp.
Delphi-Quellcode:
object.Free;
if Assigned(object) -> liefert Müll
2. Code.-Bsp.
Delphi-Quellcode:
object.Free;
FreeAndNIL(object);
if Assigned(object) -> liefert immer False (weil object NIL ist)
#Update:#
Das ist natürlich getrennt zu betrachten !



Heiko

himitsu 27. Aug 2009 09:43

Re: Free oder FreeAndNil=
 
Zitat:

Ja, kann man sagen.
joar

Zitat:

Der einzigste Unterschied der mir gerade einfällt:
Die Objekt-Referenz muss immer schreibbar sein. (Übergebe als var-Parameter)
Z.B. bei property-Objekten ohne setter dürfte das dann nicht funktionieren.
nja, es darf nur nicht CONST sein, aber normaler Weise werden Objekt-Parameter nicht als CONST definiert, also geht es da

abgesehn von den Propertys, aber da gibt man ja fast nie das Objekt via Free frei, sondern verwendet andere Wege

xZise 27. Aug 2009 10:11

Re: Free oder FreeAndNil=
 
Zitat:

Zitat von hoika
[...]
kann ich durch Nutzung von FreeAndNIL zwischendurch prüfen,
ob sie aktuell in Benutzung ist, oder nicht.

Delphi-Quellcode:
object.Free;
if Assigned(object) -> liefert Müll

FreeAndNIL(object);
if Assigned(object) -> liefert immer False (weil object NIL ist)

Sicher? Ich würde sagen, "FreeAndNil" nach "Free" wird auch einen Fehler werden :P

MfG
xZise


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:54 Uhr.
Seite 1 von 2  1 2      

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