Zitat von
Christian Seehase:
OK, aber warum?
Eigentlich gibt es - was SysUtils.FreeAndNil angeht - keinen echten Grund dafür, da Temp ohnehin nicht validiert wird (deswegen 'sollte'...).
Dem Benutzer muss klar sein, dass eine doppelte Freigabe nicht möglich ist.
Eine eigene Funktion im Stile von...
Delphi-Quellcode:
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;
...kann in MT-Scenarien durchaus hilfreich sein.
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