我是否需要释放GetEnumerator返回的枚举器?

Nam*_*ame 6 delphi collections enumerator

我想将枚举器用于Delphi XE2的泛型集合.我想知道,谁拥有函数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;
Run Code Online (Sandbox Code Playgroud)

Mar*_*ema 6

如果你看一下TDictionary的源代码,你会发现GetEnumerator(在它的祖先中)调用DoGetEnumerator,它在TDictionary中调用了重新引入的GetEnumerator版本.

重新引入的TDictionary.GetEnumerator创建一个TPairEnumerator实例,将其自身作为要枚举的字典传递.字典不包含对TPairEnumerator的引用.PairEnumerator不会收到有关其字典销毁的通知.

所以,是的,你确实需要自己释放枚举器,并且销毁它所枚举的字典之前避免任何访问违规.

  • @teran:是的,编译器添加了必要的魔法来释放隐藏的枚举器. (3认同)