![]() |
Re: Nur free oder FreeandNil
Zitat:
Delphi-Quellcode:
procedure FreeAndNil(var Obj);
var Temp: TObject; begin Temp := TObject(Obj); Pointer(Obj) := nil; Temp.Free; end; |
Re: Nur free oder FreeandNil
Moin Luckie,
wenn, dann aber
Code:
ohne das var davor wird der Wert von Obj nicht auf nil gesetzt. ;-)
procedure D4FreeAndNil([color=red][b]var[/b][/color] Obj: TObject);
begin Obj.Free; Obj := nil; end; |
Re: Nur free oder FreeandNil
Zitat:
|
Re: Nur free oder FreeandNil
Moin Nico,
Zitat:
|
Re: Nur free oder FreeandNil
Zitat:
Dem Benutzer muss klar sein, dass eine doppelte Freigabe nicht möglich ist. Eine eigene Funktion im Stile von...
Delphi-Quellcode:
...kann in MT-Scenarien durchaus hilfreich sein.
procedure MyFreeAndNil(var Obj);
var Temp: TObject; begin {$IFDEF WIN32} Temp := TObject(InterlockedExchange(Integer(Obj), Integer(nil))); if Temp <> nil then Temp.Free; {$ELSE} Temp := TObject(Obj); Pointer(Obj) := nil; if Temp <> nil then Temp.Free; {$ENDIF} end; Ist aber alles eine Frage des Kontextes in dem man die Funktion verwenden möchte. SysUtils.FreeAndNil hat den Vorteil, dass man doppelte Freigaben schneller bemerkt. Die oben skizzierte Version hat ihre Vorteile bei der einfacheren Handhabung von Objekten, welche von mehreren Threads verwendet werden (und auch nur dann, wenn man selbst kein Locking für die Freigabe implementiert hat, bzw. implementieren will - insofern bleibt die Nützlichkeit von MyFreeAndNil fragwürdig...). Gruss Nico |
Re: Nur free oder FreeandNil
FreeAndNil ist wirklich eine interessante Funktion.
Luckie zeigt die Borland-Implementation. Die kann lustige Nebenwirkungen haben, da innerhalb des Free auf die bereits zu nil gesetzte Variable gegriffen werden kann. In dem Fall bleibt nur die Seehase-Methode. Generell sollte man FreeAndNil immer anwenden, ausser an performance-relevanten Stellen. Das ist aber ausgesprochen selten. Bei der JVCL habe ich z. B. mal die finalization-Sections entsprechend aufgearbeitet und danach stuerzte Delphi nicht mehr ab wenn man alle Pakete neu uebersetzte. |
Re: Nur free oder FreeandNil
ich denke ein normales free tuts in den meisten fällen(*mirwiederfeindemach* ;) )...
|
Re: Nur free oder FreeandNil
Bei kleinen Projekten ja, aber bei grossen mit mehreren Programmierern ist FreeAndNil sehr hilfreich.
|
Re: Nur free oder FreeandNil
Also wenn ich Objekte nur innerhalb von Funktionen verwende, nehme ich free, wenn ich das Objekt später in der Funktion nicht mehr verwende (will heissen im finally - Block am Ende, wo die Funktion eh endet).
EInfach aus den Grund: Nach dem Ende der Funktion gibt es die Variablen eh nicht mehr. Dann brauch ich sie nicht auf nil setzen wenn sie eh weggeworfen wird. Anders ist das bei Member-Variablen meiner Objekte. Diese gebe ich immer mit FreeAndNil frei (ausser im Destruktor, danach gibts das Objekt ja auch nicht mehr). Will heissen: Genau dann, wenn ich nach der Freigabe gar nicht mehr auf die Referenz zugreifen kann, verwende ich Free, in allen anderen Fällen FreeAndNil. |
Re: Nur free oder FreeandNil
hallo,
es ist interessant, was eine kleine Frage auslösen kann :-D aber ich dank euch trotzdem für die ganzen Kommentare... :-D :-D mfg Helmi :thuimb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 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