2009-02-04 103 views
3

我只是考虑使用新的TDictionary类型。但QualityCentral我读造成TDictionary约两内存泄漏:TDictionary中的内存泄漏 - 解决方法存在问题?

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

我只执行了拟议的解决办法,基本上继承TDictionary,覆盖析构函数和手动freing两个物体造成泄漏:

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

问题是,因为Values和Keys是TDictionary的只读属性,所以我不能将它们设置为nil。好吧,为了清楚起见,现在所有东西都可以正常工作,但我想知道如果CodeGear为泄漏发布补丁并在自己的析构函数中再次释放这两个对象会发生什么。这不会导致访问违规?

在此先感谢您阅读(并希望能回答)。

+0

感谢您的回答。虽然我不太喜欢依赖别人在释放它们之后将所有对象设置为零的想法。还是我在这里偏执狂? – jpfollenius 2009-02-04 13:32:02

+0

我知道你的意思和同意。如果我是你,我会再次查看源代码,这个问题在热修复或服务包中解决 - 只是可以肯定的。我希望这些修复很快就会到来,因为TDictionary中还有其他严重的错误需要紧急解决。 – 2009-02-04 13:43:10

+0

另外请注意,目前你应该避免使用TDictionary,因为它的Clear方法中的一个错误以及其糟糕的Add性能。这里有更多详细信息:http://alex.ciobanu.org/?p=59 – 2009-02-04 16:38:46

回答

2

您能够打电话inherited第一和检查属性仍设置:

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

顺便说一句:Free不介意被释放的实例nil,因此,如果这将工作(但仅限于)inherited Destroy将属性设置为nil

0

我不知道以前版本的Delphi如何,但在XE5中有TObjectDictionary类,负责释放所有子项目。