在我们的应用程序框架中,我们有一些实例处理程序类,在恢复时它负责捕获由我们的其他控制器/组件/表单等创建的实例。
这是宣言:
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
。
所以问题是:我如何正确检查引用是否已被释放?
答案 0 :(得分:4)
如何正确检查引用是否已被释放?
你不能。