Delphi - 对TDictionary中的内存分配感到困惑

时间:2014-09-02 15:10:48

标签: class delphi memory-leaks tdictionary

在Delphi XE6中,我有一个名为WordDict的TDictionary,它包含TWordRec的实例。定义是:

 WordDict: TDictionary<string, TWordRec>;

...

type
  TWordRec = class
  public
    RemoveAlways: Boolean; // Is this CORP LLC, etc?
    RemoveRestricted: Boolean;
    Replace: Boolean;
    ReplaceWith: string;
    Constructor Create(B1, B2, B3: Boolean; S1: String); overload;
  end;

当我创建并加载词典....

  WordDict := TDictionary<string, TWordRec>.Create;

  WordDict.Add('CO', TWordRec.Create(True, False, False, ''));
  WordDict.Add('CORP', TWordRec.Create(True, False, False, ''));
...

我遇到内存泄漏,并且使用AQTime,它显示我的TWordRec的每次出现都是&#34;泄漏&#34;记忆。如果我将WordDict条目创建为TWordRec,如何在加载后处置它们?我是否处理它们,因为这不仅仅是字典中指向实际对象的指针吗?

装载后我是否立即丢弃TWord?当应用关闭时,我是否仅删除词典中的所有条目?我显然不明白为什么我在TWordRec上收到内存泄漏,所以我不知道如何解决它......

谢谢!

1 个答案:

答案 0 :(得分:13)

TWordRec您没有收到内存泄漏,而TDictionary的行为并不像您期望的那样。标准TDictionary类没有任何对象所有权机制。如果您将容器类更改为TObjectDictionary并使用doOwnsValues选项集创建它,它将自动释放所拥有的对象,这是您期望的行为。

另一种方法是在最终释放TDictionary对象之前,遍历释放TDictionary实例中每个对象的项目。