I have sample code below can someone explain why delphi compiler not release all memory allocation for object so nil checking is always true. im using release method for destroying TLoginForm im not using free method because that gave me exception when some interfaced event called before free or after it.
type
  TMainForm = class(TForm)
  {some stuf}
  public
    procedure Create(AOwner: TComponent); override;
    procedure doLogout();
  end;
  TChildBase = class(TForm)
  {some stuf}
  public
    procedure Create(AOwner: TComponent); override;
  end;
  TLoginForm = class(TChildBase)
  public
    procedure doLogin();
  end;
var
  MainForm: TMainForm; {<== created automaticaly at runtime}
  LoginForm: TLoginForm; {<== created at create event in TMainForm}
implementation
{TLoginForm}
procedure TLoginForm.doLogin;
begin
  if true then
  begin
    { Do Interfaced Event to main form }
    Release;
  end;
end;
procedure TMainForm.Create(AOwner: TComponent);
begin 
  inherited;
  FormStyle := fsMDIForm;
  LoginForm := TLoginForm.Create(Application); {Create login form}
end;
procedure TMainForm.doLogout;
begin
  { Do Interfaced Event to Child Form except TLoginForm to close}
  if LoginForm <> nil then    {<== this still alocated at memory}
    LoginForm := TLoginForm.Create(Application)
  else
    LoginForm.Show; {<== Error raised here.}
end;
 
     
    