2009-02-04 141 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類,負責釋放所有子項目。