delphi 是否需要从通用容器管理TEnumerator的生存期?

envsm3lx  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(100)

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

dz6r00yl

dz6r00yl1#

是的,你确实需要释放枚举器。无论谁调用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

相关问题