FreeAndNil

There are a lot of articles about the use and abuse of FreeAndNil but there is one point I really don’t like about FreeAndNil: It is not type-safe. Let’s have a look at the implementation:

{ FreeAndNil frees the given TObject instance and sets the variable reference
  to nil.  Be careful to only pass TObjects to this routine. }

procedure FreeAndNil(var Obj); inline;
...

procedure FreeAndNil(var Obj);
{$IF not Defined(AUTOREFCOUNT)}
var
  Temp: TObject;
begin
  Temp := TObject(Obj);
  Pointer(Obj) := nil;
  Temp.Free;
end;
{$ELSE}
begin
  TObject(Obj) := nil;
end;
{$ENDIF}



The comment describes the issue: “Be careful to only pass TObjects to this routine.” That’s why I would implement it in a different way:

type
  TObjectHelper = class helper for TObject
  public
    class procedure FreeAndNil<T: class>(var AValue: T); inline; static;
  end;

{ TObjectHelper }

class procedure TObjectHelper.FreeAndNil<T>(var AValue: T);
{$IF not Defined(AUTOREFCOUNT)}
var
  lTemp: TObject;
begin
  lTemp := AValue;
  AValue := nil;
  lTemp.Free;
end;
{$ELSE}
begin
  AValue := nil;
end;
{$ENDIF}

This code is type-safe and don’t use pointer arithmetic. Maybe I will ask Marco if there is a chance to add the generic FreeAndNil method directly to TObject.

This entry was posted in Delphi, RAD Studio 10.2 Tokyo, Tips and Tricks, Uncategorized. Bookmark the permalink.