![]() |
Free oder FreeAndNil=
Hallo,
ich weiß nicht, wann ich INSTANZ.Free aufrufen muss, und wann FreeAndNil(INSTANZ). Wer kann es mir erklären? Danke. |
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
|
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. |
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:
#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.
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; MfG |
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. |
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)? |
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. |
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:
2. Code.-Bsp.
object.Free;
if Assigned(object) -> liefert Müll
Delphi-Quellcode:
#Update:#
object.Free;
FreeAndNIL(object); if Assigned(object) -> liefert immer False (weil object NIL ist) Das ist natürlich getrennt zu betrachten ! Heiko |
Re: Free oder FreeAndNil=
Zitat:
Zitat:
abgesehn von den Propertys, aber da gibt man ja fast nie das Objekt via Free frei, sondern verwendet andere Wege |
Re: Free oder FreeAndNil=
Zitat:
MfG xZise |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz