在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都是“泄漏”内存。如果我将WordDict条目创建为TWordRec,则在加载它们后如何处置?我不应该处理它们,因为这不仅是字典中指向实际对象的指针吗?

加载后是否立即处置TWord?我仅在应用程序关闭时才从字典中删除所有条目吗?我显然不明白为什么我在TWordRec上遇到内存泄漏,所以我不知道如何解决它...

谢谢!

最佳答案

您没有在TWordRec上发生内存泄漏,而是TDictionary的行为异常。标准的TDictionary类没有任何对象所有权机制。如果将容器类更改为TObjectDictionary并使用doOwnsValues选项集创建它,它将在破坏时自动释放拥有的对象,这是您期望的行为。

另一种方法是遍历所有项目,以释放TDictionary实例中的每个对象,然后最终释放TDictionary对象。

10-04 19:09