6

DelphiXE2のジェネリックコレクションに列挙子を使用したいと思います。GetEnumerator関数によって返されるTEnumeratorを誰が所有しているのか疑問に思っています(ドキュメントに明確な答えは見つかりませんでした)。

  • 私はそれを所有していて、使用後にそれを解放する必要がありますか?
  • それともコレクションが所有していて、リリースする必要はありませんか?

コード:

procedure Test;
var
  myDictionary: TDictionary<String, String>;
  myEnum: TDictionary<String, String>.TPairEnumerator;
begin
  { Create a dictionary }
  myDictionary := TDictionary<String, String>.Create;
  myDictionary.Add('Key1', 'Value 1');
  myDictionary.Add('Key2', 'Value 2');

  { Use an enumerator }
  myEnum := myDictionary.GetEnumerator;
  // ... do something with the Enumerator ...

  { Release objects }
  myEnum.Free; // ** Do I need to free the enumerator? **
  myDictionary.Free;          
end;
4

1 に答える 1

6

TDictionaryのソースを見ると、GetEnumerator(その祖先)がDoGetEnumeratorを呼び出し、これがTDictionaryでGetEnumeratorの再導入バージョンを呼び出していることがわかります。

再導入されたTDictionary.GetEnumeratorは、列挙されるディクショナリとして自分自身を渡すTPairEnumeratorインスタンスを作成します。ディクショナリはTPairEnumeratorへの参照を保持していません。PairEnumeratorは、ディクショナリの破棄について通知を受けません。

したがって、はい、列挙子を自分で解放する必要があります。アクセス違反を回避するには、列挙する辞書を破棄する前に、実際にそれを実行する必要があります。

于 2012-03-15T11:40:09.890 に答える