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

时间:2015-03-05 15:23:04

标签: delphi delphi-xe2

在我们的应用程序框架中,我们有一些实例处理程序类,在恢复时它负责捕获由我们的其他控制器/组件/表单等创建的实例。

这是宣言:

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;

有时发生的事情是我们的程序员忘记了这个课程的存在或他的目的,他们释放了他们的实例。

像这样:

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

接下来发生的事情是,当TInstanceHandler完成后,它将尝试再次释放委托实例,这将导致错误。 我知道Assigned在这种情况下失败的季节,到目前为止,我无法使用FreeAndNil

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

1 个答案:

答案 0 :(得分:4)

  

如何正确检查引用是否已被释放?

你不能。