4

GetEnumeratorオブジェクトのメソッドを呼び出す場合Generics.Collections、使い終わったときに列挙子を明示的に解放する必要がありますか?

4

1 に答える 1

8

はい、列挙子を解放する必要があります。誰が呼び出し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×1
于 2013-04-18T15:20:54.070 に答える