![]() |
Warum FreeAndNil so umständlich?
Hi!
Bei der Implementierung von FreeAndNil hätte ich eigentlich erwartet:
Delphi-Quellcode:
Allerdings ist es etwas umständlicher implementiert:
procedure FreeAndNil(var Obj);
begin Obj.Free; Obj := nil; end;
Delphi-Quellcode:
Könnt ihr mir sagen, warum?
procedure FreeAndNil(var Obj);
var Temp: TObject; begin Temp := TObject(Obj); Pointer(Obj) := nil; Temp.Free; end; |
Re: Warum FreeAndNil so umständlich?
ohne eine ahnung zu haben, würde ich mal drauf tippen : damit der übergebene Pointer auf nil gesetzt wirde, selbst wenn im Destroy des Objektes eine Exception auftritt, und damit das FreeAndNil unterbrochen wird
|
Re: Warum FreeAndNil so umständlich?
Zitat:
...:cat:... |
Re: Warum FreeAndNil so umständlich?
Hi
nur ma ne Frage am Rande dazu. Wäre es langsamer, es stattdessen mit nem try..finally-Konstrukt zu versuchen? Find ich irgendwie eleganter... Gruß Michael |
Re: Warum FreeAndNil so umständlich?
Wieso try-finally :gruebel: Meinst du vielleicht try-except :?:
Verwirrte Grüsse Thorsten |
Re: Warum FreeAndNil so umständlich?
Ich denke nicht =p
Das ist so schon die schnellste Variante, würd ich behaupten.. Bye Christian |
Re: Warum FreeAndNil so umständlich?
Delphi-Quellcode:
und ja, try-finaly wäre für diese Prozedur angebracht.
procedure FreeAndNil(var Obj);
begin try Obj.Free; finally Pointer(Obj) := nil; end; end; try-except würde die Exception abfangen und genau dieses soll nicht in dier Prozedur erfolgen. was try-finally in etwa machen würde (als grobes Schema):
Delphi-Quellcode:
procedure FreeAndNil(var Obj);
begin ExceptionHandler.Installieren; // if Exception then goto doExcept; Obj.Free; goto doFinally; doExcept: ExceptionHandler.StackWiederherstellen; goto doFinally; doFinally: ExceptionHandler.Freigeben; Pointer(Obj) := nil; end; |
Re: Warum FreeAndNil so umständlich?
Warum sollte Free eine Exception auslösen? Dies könnte nur passieren, wenn das Objekt nil ist, aber das überprüft Free vorher.
|
Re: Warum FreeAndNil so umständlich?
Free ruft Destroy auf und darin kann ja wohl Unterumständen was passieren.
|
Re: Warum FreeAndNil so umständlich?
Wenn im Destructor eine Exception passiert, passiert die, auch bei free...
Und dann wär die Variable nicht nil.. so wird sie erst auf nil gesetzt und dann das eigendliche Object zerstört... Bye Christian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 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 by Thomas Breitkreuz