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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 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