2014-09-02 52 views
2

在Delphi XE6中,我有一個名爲WordDict的TDictionary,其中包含TWordRec的實例。定義是:德爾福 - 關於TDictionary中的內存分配困惑

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嗎?當應用程序關閉時,是否僅從我的Dictionary中刪除所有條目?我顯然不明白爲什麼我在TWordRec上發生內存泄漏,所以我不知道如何解決它...

謝謝!

+8

因爲您使用的是類而不是記錄,所以您可以考慮使用'TObjectDictionary'並使用'[doOwnsValues]'創建它' – bummi 2014-09-02 15:15:11

+1

我猜,在釋放字典實例之前,必須迭代其Items屬性,釋放每個TWordRec您輸入的實例。 – 2014-09-02 15:16:00

回答

13

您沒有在TWordRec上發生內存泄漏,而TDictionary的行爲並不像您期望的那樣。標準TDictionary類沒有任何對象所有權的機制。如果您將容器類更改爲TObjectDictionary並使用doOwnsValues選項集來創建它,它將自動釋放所擁有的對象以銷燬,這是您期望的行爲。

另一種方法是在最終釋放TDictionary對象之前遍歷TDictionary實例中每個對象的空閒項目。

+0

我切換到TObjectDictionary,事情似乎更順利... – user1009073 2014-09-03 12:52:45