在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
对象。