加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:29:43 所属栏目:大数据 来源:网络整理
导读:我想将枚举器用于Delphi XE2的泛型集合.我想知道,谁拥有函数GetEnumerator返回的TEnumerator(我在文档中没有找到任何明确的答案): 我拥有它并需要在使用后释放它吗? 或者它归集合所有,我不必关心发布它? 码: procedure Test;var myDictionary: TDictiona
我想将枚举器用于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;

解决方法

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读