4
메서드를 Generics.Collections
개체라고 부르는 경우, 작업을 끝내면 명시 적으로이를 해제해야합니까?일반 컨테이너에서 TEnumerator의 수명을 관리해야합니까?
메서드를 Generics.Collections
개체라고 부르는 경우, 작업을 끝내면 명시 적으로이를 해제해야합니까?일반 컨테이너에서 TEnumerator의 수명을 관리해야합니까?
예 열거자를 해제해야합니다. 누구든지 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