是否有必要从通用容器管理TEnumerators的生命周期?

wad*_*des 4 delphi

如果我调用GetEnumerator一个Generics.Collections对象的方法,那么当我完成它时,是否需要显式释放枚举器?

Dav*_*nan 8

是的,你需要释放调查员.无论谁打电话都GetEnumerator拥有它返回的东西.

当它是for/in循环时,编译器会编写代码并确保处理枚举器对象.当你打电话给它时,处理枚举器是你的工作.

事实上,这是一个非常容易回答的问题.只需创建一个调用GetEnumerator并失败的程序Free.使用内存管理器的工具来检查对象是否泄漏.

uses
  System.Generics.Collections;

begin
  ReportMemoryLeaksOnShutdown := True;
  with TList<Integer>.Create do
  begin
    GetEnumerator;
    Free;
  end;
end.
Run Code Online (Sandbox Code Playgroud)

这导致以下泄漏报告:

发生意外的内存泄漏.意外的小块泄漏是:

  • 13 - 20字节:TList.TEnumerator x 1