System.ReportMemoryLeaksOnShutdown:=True; 로 메모리 누수를 검사하던 중 도저히 안잡히는 게 있었음.


TThemeServices x 1 (7바이트짜리)


구글링을 좀 해보니까 FastMM 관련하여 알려진 문제로,
DLL 내에서 저게 사용될 경우 일어나는 문제라는 것.

Themes.pas 파일의 finalization 부분에 보면,

if not IsLibrary then InternalServices.Free; 부분이 있는데,
IsLibrary가 제대로 세팅되지 않아서 Free가 호출되지 않는다는 것.
(IsLibrary는 module이 DLL인지 여부를 세팅하는 Boolean)



임의로 DLLProc의 DLL_PROCESS_DETACH에서 명시적으로 해제해주면 누수는 사라짐.
아래처럼.



// uses에 Themes 추가


function
DLLMain(dwReason: DWORD): Boolean;
begin
  Result:=True;

  case dwReason of
    DLL_PROCESS_ATTACH: begin
      // 막 뭔가 시작하는 분위기
    end;

    DLL_PROCESS_DETACH: begin
      // 막 뭔가 접는 분위기
      
      // 메모리 릭 때문에 명시적으로 해제
     ThemeServices.Free;

    end;
  end;
end;


begin
  DLLProc:=@DLLMain;
  if Assigned(DLLProc) then begin
    DLLMain(DLL_PROCESS_ATTACH);
    ReportMemoryLeaksOnShutdown:=True;
  end;
end.




Posted by bloodguy
,