2

Delphi XE6 には、TWordRec のインスタンスを保持する WordDict という 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 を破棄しますか? アプリが終了したときにのみ、辞書からすべてのエントリを削除しますか? TWordRecでメモリリークが発生する理由が明らかにわからないため、解決方法がわかりません...

ありがとう!

4

1 に答える 1

13

でメモリ リークが発生しておらずTWordRecTDictionaryが期待どおりに動作していません。標準TDictionaryクラスには、オブジェクトの所有権に関するメカニズムがありません。コンテナー クラスを に変更TObjectDictionaryし、オプション セットを使用して作成するとdoOwnsValues、所有しているオブジェクトが破壊時に自動的に解放されます。これは、期待どおりの動作です。

別の方法として、アイテムを反復処理してTDictionaryインスタンス内の各オブジェクトを解放してから、最終的にTDictionaryオブジェクトを解放します。

于 2014-09-02T15:49:42.973 に答える