2014-09-02 3 views
2

에서 메모리 할당에 대한 혼란, 나는 TWordRec의 인스턴스를 포함 WordDict라는 TDictionary 있습니다. 정의는 다음과 같습니다델파이 - 델파이 XE6에서 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; 

I 작성하고 사전로드 ....

WordDict := TDictionary<string, TWordRec>.Create; 

    WordDict.Add('CO', TWordRec.Create(True, False, False, '')); 
    WordDict.Add('CORP', TWordRec.Create(True, False, False, '')); 
... 

I 메모리 누수로 실행하고 내 TWordRec의 각각의 발생을 보여 AQTime을 사용하고있다 "누출 "기억. TWordRec으로 WordDict 항목을 만드는 중이면로드 한 후에 어떻게 처리합니까? 이 객체는 사전에 실제 객체에 대한 포인터가 아니기 때문에 처리합니까?

나는 즉시 로딩 후 TWord 처분합니까? 응용 프로그램이 종료 될 때만 내 사전에서 모든 항목을 삭제합니까? TWordRec에서 메모리 누수가 발생하는 이유는 무엇인지 이해하지 못하기 때문에 해결 방법을 모르겠습니다 ...

감사합니다!

+8

레코드가 아닌 클래스를 사용하고 있으므로 TObjectDictionary를 사용하여'[doOwnsValues] '로 작성하는 것이 좋습니다 – bummi

+1

사전 인스턴스를 해제하기 전에 Items 속성을 반복하여 각 TWordRec 당신이 넣어 인스턴스입니다. –

답변

13

TWordRec에서 메모리 누수가 발생하지 않고 TDictionary이 예상대로 동작하지 않습니다. 표준 TDictionary 클래스는 오브젝트 소유권에 대한 메커니즘이 없습니다. 컨테이너 클래스를 TObjectDictionary으로 변경하고 doOwnsValues 옵션 세트를 사용하여 컨테이너 클래스를 생성하면 소유하고있는 객체가 예상대로 작동하지 않을 때 자동으로 해제됩니다.

대안은 TDictionary 개체를 마지막으로 해제하기 전에 TDictionary 인스턴스의 각 개체를 해제하는 항목을 반복하는 것입니다.

+0

내가 TObjectDictionary 사물로 전환이 매끄럽게가는 것 같다 ... – user1009073