内存泄漏问题使用接口?

时间:2013-12-08 12:50:11

标签: delphi delphi-xe4

我有一个返回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;

但这样做没有错吗?因为当我访问字典时必须首先实例化那个人?

1 个答案:

答案 0 :(得分:4)

最可能的解释是TPerson不使用接口引用计数来管理生命周期。确保我们需要确切知道TPerson如何实现IInterface。不幸的是,问题中忽略了关键细节。

如果TPerson派生自TInterfacedObject,并且生命周期由引用计数管理,则您的代码不会泄漏。所以,我有理由相信问题是当你的引用计数变为零时,你的类的IInterface实现不会释放该对象。

假设我是正确的,那么你有几个选择来解决这个问题:

  1. 更改您的班级以实施接口参考计算生命周期管理。
  2. 使用TObjectDictionary<TKey,TValue>而不是TDictionary<TKey,TValue>。安排值类型TValueTPerson而不是IInterface。并安排字典拥有其值,以便在删除它们时可以释放它们。

  3. 更新:您的更新显示我的预感是正确的。您的类不管理接口引用计数的生命周期。