AGB  ·  Datenschutz  ·  Impressum  







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

Free oder FreeAndNil=

Ein Thema von Pilloker · begonnen am 27. Aug 2009 · letzter Beitrag vom 27. Aug 2009
Antwort Antwort
Seite 1 von 2  1 2      
Pilloker
(Gast)

n/a Beiträge
 
#1

Free oder FreeAndNil=

  Alt 27. Aug 2009, 08:25
Hallo,

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

Danke.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Free oder FreeAndNil=

  Alt 27. Aug 2009, 08:29
Object.Free() gibt das Objekt frei. Die Referenzvariable verweist aber immer noch auf den Speicher des Objekts. FreeAndNil() setzt diese zusätzlich aug Nil
Markus Kinzler
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#3

Re: Free oder FreeAndNil=

  Alt 27. Aug 2009, 08:40
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.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Free oder FreeAndNil=

  Alt 27. Aug 2009, 08:41
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
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von mleyen
mleyen

Registriert seit: 10. Aug 2007
609 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Free oder FreeAndNil=

  Alt 27. Aug 2009, 08:42
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.
  Mit Zitat antworten Zitat
Pilloker
(Gast)

n/a Beiträge
 
#6

Re: Free oder FreeAndNil=

  Alt 27. Aug 2009, 09:31
Also kann man sagen, dass es generell in Ordnung ist, wenn man stets FreeAndNil aufruft (den Punkt von
QuickAndDirty mal ausgenommen)?
  Mit Zitat antworten Zitat
Benutzerbild von mleyen
mleyen

Registriert seit: 10. Aug 2007
609 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Free oder FreeAndNil=

  Alt 27. Aug 2009, 09:38
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.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Free oder FreeAndNil=

  Alt 27. Aug 2009, 09:41
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
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#9

Re: Free oder FreeAndNil=

  Alt 27. Aug 2009, 09:43
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Free oder FreeAndNil=

  Alt 27. Aug 2009, 10:11
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

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:03 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