3

我只是考虑使用新的 TDictionary 类型。但是在 QualityCentral 上,我读到了由 TDictionary 引起的两个内存泄漏:

http://qc.codegear.com/wc/qcmain.aspx?d=67355

我刚刚实现了建议的解决方法,基本上是子类化 TDictionary,覆盖析构函数并手动释放导致泄漏的两个对象:

destructor TMemCorrectedDictionary.Destroy;
begin
  Values.Free;
  Keys.Free;
  inherited;
end;

问题是,由于 Values 和 Keys 是 TDictionary 的只读属性,我不能将它们设置为 nil。好吧,为了清楚起见,现在一切正常,但我想知道如果 CodeGear 为泄漏发布补丁并在它们自己的析构函数中再次释放这两个对象会发生什么。这不会导致访问冲突吗?

提前感谢您的阅读(并希望能回答)。

4

3 回答 3

2

您可以inherited先调用并检查属性是否仍然设置:

destructor TMemCorrectedDictionary.Destroy;
begin
  inherited;
  Values.Free;
  Keys.Free;
end;

顺便说一句:Free不关心要释放的实例是否为nil,所以如果(但仅当)inherited Destroy将属性设置为 ,这将起作用nil

于 2009-02-04T13:23:20.753 回答
2

我不知道以前版本的 Delphi 怎么样,但在 XE5 中有一个 TObjectDictionary 类负责释放所有子项。

于 2014-02-27T08:48:10.317 回答
0

创建字典时使用此参数,它将释放对象。

TObjectDictionary<string, TMyClass>.Create([doOwnsValues]);
于 2019-08-22T03:23:29.217 回答