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.
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.
'Delphi' 카테고리의 다른 글
[Delphi] TStringList의 CustomSort (0) | 2010.05.24 |
---|---|
[Delphi] 문자가 배열에 속하는지 비교 (0) | 2010.05.24 |
[Delphi] UTF-8 인코딩 파일 읽기 (0) | 2010.05.18 |
[Delphi] 콘솔 어플리케이션(Console Application) 프로젝트에서 아이콘 적용하기. (0) | 2010.05.18 |
[Delphi] DLL Injection 후에 폼을 다른 윈도우의 Dialog 처럼 띄우기 (0) | 2010.05.14 |