【问题标题】:Delphi - Confused about memory allocation in TDictionaryDelphi - 对 TDictionary 中的内存分配感到困惑
【发布时间】:2014-09-02 15:10:47
【问题描述】:

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

谢谢!

【问题讨论】:

  • 由于您使用的是类而不是记录,您可以考虑使用TObjectDictionary 并使用[doOwnsValues] 创建它
  • 我猜,在你释放字典实例之前,你必须遍历它的 Items 属性,释放你放入的每个 TWordRec 实例。

标签: class delphi memory-leaks tdictionary


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-11-16
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 2012-09-18
    相关资源
    最近更新 更多