Indy 콤포넌트를 쓰면서 RegisterExpectedMemoryLeak을 이용해 메모리누수를 체크할 경우,
항상 TIdThreadSafeInteger, TIdCriticalSection이 Leak이 되었다고 리포트가 나온다.
Indy 소스를 보면 주석에 의도적으로 Leak이 되도록 남겨놨다고 합니다.  (볼랜드포럼에서 참조)
 
IdStack.pas
finalization
  // Dont Free. If shutdown is from another Init section, it can cause GPF when stack
  // tries to access it. App will kill it off anyways, so just let it leak
  {$IFDEF IDFREEONFINAL}
  Sys.FreeAndNil(GStackCriticalSection);
  {$ENDIF}


IdThread.pas
finalization
  // This call hangs if not all threads have been properly destroyed.
  // But without this, bad threads can often have worse results. Catch 22.
//  TIdThread.WaitAllThreadsTerminated;

  {$IFDEF IDFREEONFINAL}
  //only enable this if you know your code exits thread-clean
  Sys.FreeAndNil(GThreadCount);
  {$ENDIF}

 
 
FastMM 4.78 버전은 첨부파일로 필요한 파일만 올립니다.
원하는 프로젝트의 디렉토리에 넣거나 전역 라이브러리 PATH에 넣어두시면 됩니다.
 
출력하지 않는 방법은 FastMM 의 최신버전인 4.78 을 이용하여, RegisterExpectedMemoryLeak 함수를 이용하는 것.
원래부터 FastMM 이 메모리관리자로 추가되어 있기 때문에
ReportMemoryLeaksOnShutdown, RegisterExpectedMemoryLeak 함수를 사용할 수 있지만,
기본버전의 RegisterExpectedMemoryLeak 함수는 포인터만을 매개변수로 받기 때문에,
인디의 메모리누수되는 놈을 정확하게 외부에서 지정할 수가 없다.
하지만 4.78 버전에 오버로드된 새로운 버전이 있기 때문에 그놈을 사용하면 해당하는 인디의 메모리 누수 출력을 없앨 수 있다.
 
1. dpr 파일의 uses 가장 처음에 FastMM4 추가
2. 메모리 누수 검사부분을 아래와 같이 만든다.
RegisterExpectedMemoryLeak(TIdThreadSafeInteger, 1);
RegisterExpectedMemoryLeak(TIdCriticalSection, 2);
ReportMemoryLeaksOnShutdown:=True;
 
Posted by bloodguy
,