2009-12-27 1 views
0

일부 개체를 저장하는 TList가 있습니다. 지금은 그 목록에 몇 가지 작업을 수행하는 기능이 있습니다 ... 정말 이상한 어떤 적절한 인덱스 fMgr.Windows에 액세스하는 EListError이 발생한다는 것입니다 무엇인지 지금이상한 EListError 발생 (변수 정의 인덱스에 액세스 할 때)

function SomeFunct(const AIndex: integer): IInterface 
begin 
if (AIndex > -1) and (AIndex < fMgr.Windows.Count) then 
    begin 
    if (fMgr.Windows[AIndex] <> nil) then 
     begin 
     if not Supports(TForm(fMgr.Windows[AIndex]), IMyFormInterface, result) then 
      result:= nil; 
     end; 
    end 
else 
    result:= nil; 
end; 

을, 그러나 내가 하드 코딩을하는 경우 (예를 들어, AIndex를 값 0 또는 1로 바꿉니다) 잘 작동합니다. 디버깅을 시도했지만, 함수는 인수 0과 1 (가정)을 사용하여 두 번 호출됩니다.

AIndex = 0 동안, fMgr.Windws을 평가하는 동안, $ someAddress에서 EListError에서 fMgr.Windows [AIndex] 결과를 평가 [0] 대신 - 반환 적절한 결과 ... 더 이상, 심지어 어떤

EListError가 있지만이 함수는 적절한 데이터를 반환하고 아무 것도 표시하지 않습니다. 종료시 두 개의 EListError 메모리 누수에 대한 정보 (FastMM 사용)

잘못된 정보가 있습니까?! 사전 마이클

+0

예외가 발생합니까? 종료시 두 개의 메모리 누수 메시지를 기반으로합니까? Throw되는 예외가 문제인지 메모리 누수인지 명확히 할 수 있습니까? 왜냐하면 나는 예외가 발생했는지 의심하기 때문이다. –

+0

그래서 fMgr.Windows가 TList입니까? 실제 TList 또는 TInterfaceList 또는 일반 목록입니까? –

+0

이것은 TForms (실제로 TForm을 기반으로하는 사용자 정의 클래스 중 일부는 주어진 인터페이스를 구현하는)의 목록을 저장하는 TList입니다. Delphi7이므로 제네릭은 불가능합니다.) FastMM이 누수를보고하면 오류가 발생하지 않지만 분명히 만들어져 야합니다. 누설이있는 경우 오류가 발생하지 않습니다. 또한 변수 감시는이 표현식을 오류로 평가합니다. – migajek

답변

1

나는 어떤면에서는 디버거를 혼란스럽게 생각한다고 생각합니다. 때로는 "깨끗한"누수없는 코드가 속성을보고있는 시계가있는 경우 메모리 누수가 발생하여 해당 시계를 평가하면 예외가 발생합니다. 디버거에서 처리하는 IDE에는 표시되지 않습니다.

Aindex가 초기화되기 전에 fMgr.Windows [AIndex]를 표시하는 디버거가 있거나 목록에 항목이 있기 전에 fMgr.Windows [0]을 감시하는 경우에 발생할 수 있습니다.

0

에서

감사 인덱스가 올 경우는 EListError을 던져에 대한 이유가 없다. 예외가 던져지면 표시되지 않고 여전히 정상적인 결과를 반환 할 이유가 없습니다.

은 아마 당신이 멀티 스레딩 문제가있는 :

불행히도 문제가이 작은 정보로 무엇 그래서 난 단지 추측 할 수 볼 어렵다? 어쩌면 예외가 발생하지만 디버거가 중단 점에서 멈추지 않을 수 있습니까? 어쩌면 누수가이 코드에서 나온 것이 아니겠습니까? 아마도 거짓 누출 신고일까요? 어쩌면 fMgr가 다른 것을 참조 할 수 있습니까? 어쩌면 사실이 다른가요?

더 많은 디버그 정보를 켜고 FastMM이 콜백 (callstack)을보고하거나 디버그 DCU를 사용하여 컴파일하고 TList 코드를 추적 해 볼 수 있습니다. 그리고 델파이가 모든 예외에서 멈추는 지 확인하십시오. 어쩌면 그것이 당신의 문제를 찾는 데 도움이 될 것입니다.