2

在 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 上出现内存泄漏,所以我不知道如何解决它......

谢谢!

4

1 回答 1

13

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

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

于 2014-09-02T15:49:42.973 回答