在这种情况下如何检查实例是否已被释放?
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?
你不能。
在我们的应用程序框架中,我们有某种实例处理程序 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?
你不能。