Нужно ли освобождать перечислитель, возвращаемый GetEnumerator? - PullRequest
6 голосов
/ 15 марта 2012

Я хочу использовать перечислитель для универсальной коллекции с Delphi XE2. Мне интересно, кому принадлежит TEnumerator, возвращаемый функцией GetEnumerator (я не нашел четкого ответа в документации):

  • Есть ли у меня его и нужно ли его освободить после использования?
  • Или она принадлежит коллекции, и мне не нужно заботиться о ее выпуске?

Код:

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;

1 Ответ

6 голосов
/ 15 марта 2012

Если вы посмотрите на источник TDictionary, вы обнаружите, что GetEnumerator (в его предке) вызывает DoGetEnumerator, который в TDictionary вызывает повторно введенную версию GetEnumerator.

Повторно введенный TDictionary.GetEnumerator создает экземпляр TPairEnumerator, передавая себя в качестве словаря для перечисления. Словарь не содержит ссылку на TPairEnumerator. PairEnumerator не получает уведомления об уничтожении своего словаря.

Итак, да, вам действительно нужно освободить перечислитель и, чтобы избежать любых нарушений прав доступа, вы действительно должны сделать это до уничтожения словаря, который он перечисляет.

...