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

问题描述 投票:0回答:1

如果我调用

GetEnumerator
对象的
Generics.Collections
方法,完成后是否需要显式释放枚举器?

delphi generics enumerator
1个回答
9
投票

是的,您确实需要释放枚举器。谁调用

GetEnumerator
就拥有它返回的内容。

当它是

for/in
循环时,编译器编写代码并确保枚举器对象被释放。当你调用它时,你的工作就是处理枚举器。

这实际上是一个很容易自己回答的问题。只需创建一个调用

GetEnumerator
且无法
Free
的程序即可。使用内存管理器的工具来检查对象是否泄漏。

uses
  System.Generics.Collections;

begin
  ReportMemoryLeaksOnShutdown := True;
  with TList<Integer>.Create do
  begin
    GetEnumerator;
    Free;
  end;
end.

这会导致以下泄漏报告:

发生了意外的内存泄漏。意想不到的小块泄漏是:

  • 13 - 20 字节:TList.TEnumerator x 1
© www.soinside.com 2019 - 2024. All rights reserved.