在这种情况下如何检查实例是否已被释放?

How to check if a instance was already freed in this case?

在我们的应用程序框架中,我们有某种实例处理程序 class,在 resume 中它负责捕获我们其他人创建的实例 controllers/components/forms/etc。

声明如下:

TInstanceHandler = class(TFrameworkClass)
strict private
  FInstances : TList<TObject>;
  procedure FreeInstances();
protected
  procedure Initialize(); override;
  procedure Finalize(); override;
public
  function Delegate<T : class>(const AInstance : T) : T;
end;

和实施:

procedure TInstanceHandler.FreeInstances();
var AInstance : TObject;
begin
  for AInstance in FInstances do
    if(Assigned(AInstance)) then AInstance.Free();
  FInstances.Free();
end; 

procedure TInstanceHandler.Initialize();
begin
  inherited;
  FInstances := TList<TObject>.Create();
end;

procedure TInstanceHandler.Finalize();
begin
  FreeInstances();
  inherited;
end;

function TInstanceHandler.Delegate<T>(const AInstance : T) : T;
begin
  FInstances.Add(AInstance);
end;

有时我们的程序员忘记了这个 class 的存在或他的目的,他们释放了他们的实例。

像这样:

with InstanceHandler.Delegate(TStringList.Create()) do
  try
    //...
  finally
    Free();
  end;

接下来发生的事情是,当 TInstanceHandler 完成时,它将尝试再次释放委托实例,这将导致错误。 我知道为什么 Assigned 在这种情况下失败的季节,据我所知我不能使用 FreeAndNil.

所以问题是:如何正确检查引用是否已被释放?

How I can correctly check if the reference was already freed?

你不能。