3

新しい TDictionary 型の使用を検討しました。しかし、QualityCentral では、TDictionary によって引き起こされる 2 つのメモリ リークについて読みました。

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

提案された回避策を実装しました。基本的には TDictionary をサブクラス化し、デストラクタをオーバーライドし、リークの原因となる 2 つのオブジェクトを手動で解放します。

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

問題は、Values と Keys が TDictionary の読み取り専用プロパティであるため、それらを nil に設定できないことです。念のために言っておきますが、今はすべて問題なく動作していますが、CodeGear がリークのパッチをリリースし、2 つのオブジェクトをそれぞれのデストラクタで再び解放したらどうなるのだろうと考えました。アクセス違反になりませんか?

読んでくれてありがとう(そしてうまくいけば答えてくれる)。

4

3 に答える 3

2

最初に呼び出しinheritedて、プロパティがまだ設定されているかどうかを確認できます。

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

ちなみにFree、解放されるインスタンスが であるかどうかは気にしないため、プロパティを に設定したnil場合にのみ機能します。inherited Destroynil

于 2009-02-04T13:23:20.753 に答える