我刚考虑使用新的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发布泄漏补丁并在他们自己的析构函数中再次释放两个对象会发生什么。这不会导致访问冲突吗?
提前感谢阅读(并希望回答)。
答案 0 :(得分:2)
您可以先调用inherited
并检查属性是否仍然设置:
destructor TMemCorrectedDictionary.Destroy;
begin
inherited;
Values.Free;
Keys.Free;
end;
顺便说一下:Free
并不关心要释放的实例是nil
,所以如果(但仅限于)inherited Destroy
将属性设置为{{}} {1}}。
答案 1 :(得分:0)
我不知道以前版本的Delphi如何,但在XE5中有TObjectDictionary类可以解决所有子项目的问题。
答案 2 :(得分:0)
在创建字典时使用此参数,它将释放对象。
TObjectDictionary<string, TMyClass>.Create([doOwnsValues]);