2017-03-06 9 views
2

Delphi XE7 (RAD Studio 사용)에서 패키지 안의 코드를 디버깅하려고합니다. 나는 설명 할 수없는 이상한 상황에 곤경에 빠진다. 예를 들어, 아래 함수와 비슷합니다 (참고이 함수는 지능이 없습니다. 현실 세계에서는 사용하지 않기 때문에 수정하지 마십시오. 나는 위의 코드를 디버깅 할 때 내가 직면 한 문제를 해결합니다.)디버거가 for-in 루프의 소멸자를 통해 단계를 수행하는 이유는 무엇입니까?

procedure TMyClass.DemoFunc(); 
var 
    pTest:  TObjectList<TObject>; 
    pProperty: TObject; 
begin 
    pTest := TObjectList<TObject>.Create; 

    for pProperty in pTest do 
     pProperty.ToString; 

    pTest.Free; 
end; 

, 나는 디버거가 라인

pProperty.ToString; 

나는 위의 라인으로 추적하려는 경우에 입력 통지, 나는

로 이동
destructor TObject.Destroy; 

하지만 내 관점에서 볼 때 pTest가 분명히 비어 있기 때문에 완전히 비논리적이므로 위의 행을 호출해서는 안됩니다.

누군가 내게이 이상한 행동을 설명 할 수 있습니까?

참고 디버그하려고하는 코드는 Delphi 패키지 안에 있지만이 함수는 C++ 프로젝트에서 호출됩니다.

안부

TObject의 파괴되고
+1

엠바는 기본 컬렉션에 할당 된 힙을 할당하기로 결정했습니다. 마치 개발자가 힙의 비용 영향을 이해하지 못하는 것입니다. –

+0

대신 for-to 루프를 사용하는 것이 타당한 이유 일 수 있습니까? –

+1

대부분 문제가되지 않습니다. 그러나 거대한 머신에서 심각한 멀티 스레딩 코드를 수행하는 경우 메모리 관리자의 충돌이 문제가 될 수 있습니다. –

답변

7

는 피 루프에 대해 컴파일러에 의해 암시 적으로 생성 된 열거된다. "pProperty"가 아닙니다. TObject.Destroy의 시작 부분에서 디버거가 중지되고 "self.classname"을 입력하면 Evaluator를 불러 와서 "TList <System.TObject> .TEnumerator"라는 것을 알 수 있습니다.