![]() |
Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Kann jemand mir erklären, welchen Unterschied gibt es zwischen FreeAndNil(Objekt) und Objekt.Free?
|
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
FreeAndNil ist
Delphi-Quellcode:
Objekt.Free;
Objekt := Nil; |
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:
gibt nur den reservierten (und belegten) Speicherbereich frei, auf den myVar zeigt.
myVar.Free
Der Zeiger selber hat danach immer noch die Adresse des Speicherbereiches.
Delphi-Quellcode:
gibt den reservierten (und belegten) Speicherbereich frei und setzt zusätzlich
FreeAndNil(myVar);
der Zeiger von myVar auf nil. Damit kannst Du hinterher sauber mit (myVar = nil) prüfen. Gruß, Christoph |
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
|
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Hallo,
Vorsicht mit solchen Behauptungen.
Delphi-Quellcode:
Was du meintest war, dass .Free auch bei NIL-Objekten klappt.
procedure TForm1.FormCreate(Sender: TObject);
var Button: TButton; begin FreeAndNIL(Button); // Schutzverletzung ! end;
Delphi-Quellcode:
Was das etwas undurchsichtig macht ist, dass Klassenvariablen
procedure TForm1.FormCreate(Sender: TObject);
var Button: TButton; begin Button:= NIL; Button.Free; // OK end; automatisch initialisiert werden, Zeiger und damit auch Objekte also z.B. NIL sind. Das FreeAndNIL ist einfach die Zusammenfassung von 2 Befehlen. Heiko |
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Zitat:
[edit] Zitat:
[/edit] |
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Zitat:
|
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. |
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Zitat:
|
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Zitat:
|
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Zitat:
|
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Zitat:
Zitat:
|
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Zitat:
Ist schon etwas länger her, aber ich glaube das auf NIL setzen reichte nicht aus, sofern darauf geprüft wird und ein zu entfernendes TObject ist nicht da. Bevor mir einen einen Strick daraus dreht : das nächste ist ohne Gewähr. Ist das TObject in keinster Weise initialisiert, dann kommen vermutlich Fehler. Folgende Konstruktion lief bisher ohne jeden Fehler :
Delphi-Quellcode:
Das FreeAndNil könnte da vielleicht eine Zeile sparen aber nicht ohne die Abfrage <> nil ! Damit wird aber jetzt nicht rumgespielt, denn es gilt : "Never change a running system".
if Objekt <> nil then begin
Objekt.Free; Objekt := nil; end; |
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Die Abfrage auf Nil macht IMHO FreeAndNil
|
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
FreeAndNil() überprüft nicht, aber Free macht dies. Und Free wird aufgerufen. Somit lässt sich's Hansa's abschliessendes Codestück durch einen einzigen FreeAndNil() Aufruf ersetzen, der gleiches macht.
FreeAndNil():
Delphi-Quellcode:
Free Methode:
procedure FreeAndNil(var Obj);
var P: TObject; begin P := TObject(Obj); TObject(Obj) := nil; // clear the reference before destroying the object P.Free; end;
Delphi-Quellcode:
Einer von den Geeks hier im Forum könnte uns mal aufklären, warum in DL unbedingt eine 1 stehen muss beim Aufruf von Destroy
procedure TObject.Free;
asm TEST EAX,EAX // If not Assigned Then JE @@exit // goto exit MOV ECX,[EAX] // get virtual methode table MOV DL,1 CALL dword ptr [ECX].vmtDestroy // call actual Destroy methode implementation for the instance @@exit: end; |
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Zitat:
Delphi-Quellcode:
Um Zeile 16275 :shock: in Sysutils.pas (D7) Eine Abfrage auf NIL ist da nicht zu sehen. Warum auch immer, aber nur der vorher gepostete Code hat sich als wasserdicht herausgestellt.
procedure FreeAndNil(var Obj);
var Temp: TObject; begin Temp := TObject(Obj); Pointer(Obj) := nil; Temp.Free; end; |
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Zitat:
|
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Mütze, das ist fies. :mrgreen: Erst halb schreiben und dann nachträglich editieren, während ich die relevante Stelle im Source suche. :P
|
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Zitat:
Hinweis: Die Kommentare vom Assemblercode sind von mir... |
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Hier ist noch etwas von Borland:
Zitat:
|
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Interessant was sich aus der Frage alles so ergibt!
Aber meine Detailfrage ist nun immer noch nicht vollständig beantwortet: Ich habe eine Klasse TMyVar mit einem Member vom Typ TStringlist. Diese Member wird im Konstruktor meiner Klasse ordnungsgemäß erzeugt. Jetzt benutze ich die Klasse in einer function/procedure:
Delphi-Quellcode:
Ist nun Variante a), b) notwendig oder muss man c) gar nichts damit machen, da am Ende der Methode die lokale Variable myVar automatisch einen .Free-Aufruf erhält?
procedure TForm1.Beispiel;
var MyVar: TMyVar; begin MyVar:=TMyVar.Create; // hier passiert dann mal was... ... // hier ist das Ende der Procedur: FreeAndNil(MyVar); // a) MyVar.Free; // b) // c) end; Gruß, Christoph |
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Zitat:
|
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Kann man bei Records, Strings und dynamischen Arrays nicht von Garbage Collection sprechen?
|
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Zitat:
|
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Zitat:
|
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Hallo Kha..,
was heisst, muss nicht sein ? Schon klar, dass man sowas vermeiden sollte. Es ist aber so, dass FreeAndNIL nicht initialisierte Objekte nicht erkennen kann. Dafür gibt es ja dass NIL setzen. Zum "Was sollte man nehmen". Destroy nie direkt aufrufen. Zum Freigeben .Free benutzen, falls das Objekt später nicht mehr benutzt wird, weil es z.B. eine lokale Variable ist. FreeAndNIL fasst 2 Befehle zusammen (Free and NIL, wer hätte das gedacht ;) ), macht also Sinn, wenn das Objekt mehrfach verwendet werden kann. Wir ein Objekt über lokale Variable erzeugt und nicht freigegeben, bleibt der Speicher belegt, bis das Programm beendet wird (nicht unter Win9X). Wenn ich also so eine Prozedur 1 Mio. mal im Programm benutze, frisst die jedes mal Speicher. Und irgendwann sind auch 2 Gig weg. Heiko |
Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:46 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