我有一个返回IInterface
的方法,该方法包含一个像这样创建的字典:
Dictionary:= TDictionary<string, IInterface>.Create;
包含:
Dictionary.Add('key', TPerson.Create(DatabaseCon)as IInterface);
当我退出正在进行的程序时,我在对象Tperson
上收到错误消息内存泄漏。
我在类析构函数方法中尝试了以下内容:
private //Global variabels
Person:TPerson;
I: IInterface;
begin // in the destructor method of the class
Person:= IInterface as TPerson;
Person.Free;
end;
但我仍然收到错误......我如何发布TPerson.Create(DatabaseCon) as IInterface)
?
或者将TPerson保存为INI文件中的字符串然后将字符串名称拖出并将其转换为对象会更好..但是如何?
该计划的结构:
Inf1= Interface(IInterface)
//some functions
Inf2=Interface(Inf1)
//Some functions
TPerson= class(TInterfacedPersistent,Inf2)
// All my functions.
如果我:
,我可以让它发挥作用Dictionary.Add ('key', Person) as IInterface);
我在类的Create方法中写道:
Person:= TPerson.Create(DatabaseCon);
并在析构函数方法中写道:
Person.Free;
但这样做没有错吗?因为当我访问字典时必须首先实例化那个人?
答案 0 :(得分:4)
最可能的解释是TPerson
不使用接口引用计数来管理生命周期。确保我们需要确切知道TPerson
如何实现IInterface
。不幸的是,问题中忽略了关键细节。
如果TPerson
派生自TInterfacedObject
,并且生命周期由引用计数管理,则您的代码不会泄漏。所以,我有理由相信问题是当你的引用计数变为零时,你的类的IInterface
实现不会释放该对象。
假设我是正确的,那么你有几个选择来解决这个问题:
TObjectDictionary<TKey,TValue>
而不是TDictionary<TKey,TValue>
。安排值类型TValue
为TPerson
而不是IInterface
。并安排字典拥有其值,以便在删除它们时可以释放它们。更新:您的更新显示我的预感是正确的。您的类不管理接口引用计数的生命周期。