메모리 블록이 해제되지 않았는지 감지하려고합니다. 물론 관리자는 대화 상자 나 로그 파일로 알려주지 만 결과를 데이터베이스에 저장하려면 어떻게해야합니까? 예를 들어, 주어진 블록을 할당 한 루틴의 이름을 데이터베이스 테이블에 갖고 싶습니다.
FastMM의 문서를 읽은 후 버전 4.98 이후로 메모리 할당, 해제 및 재 할당에 대해 관리자가 알릴 가능성이 있다는 것을 알고 있습니다. 예를 들어 OnDebugFreeMemFinish
이벤트는 PFullDebugBlockHeader
유용한 정보를 포함하는를 우리에게 전달합니다 . 한 가지 PFullDebugBlockHeader
빠진 것이 있습니다 -주어진 블록이 애플리케이션에 의해 해제되었다는 정보입니다.
OnDebugFreeMemFinish
해제되지 않은 블록에 대해서만 호출 되지 않는 한 ? 이것은 내가 모르고 알고 싶은 것입니다.
문제는 OnDebugFreeMemFinish
이벤트에 연결해도 블록이 해제되었는지 여부를 알 수 없다는 것입니다.
다음은 예입니다.
program MemLeakTest;
{$APPTYPE CONSOLE}
uses
FastMM4, ExceptionLog, SysUtils;
procedure MemFreeEvent(APHeaderFreedBlock: PFullDebugBlockHeader; AResult: Integer);
begin
//This is executed at the end, but how should I know that this block should be freed
//by application? Unless this is executed ONLY for not freed blocks.
end;
procedure Leak;
var
MyObject: TObject;
begin
MyObject := TObject.Create;
end;
begin
OnDebugFreeMemFinish := MemFreeEvent;
Leak;
end.
내가 놓친 것은 다음과 같은 콜백입니다.
procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
FastMM의 소스를 검색 한 후 절차가 있음을 알았습니다.
procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean);
재정의 할 수 있지만 더 쉬운 방법이 있을까요?
OnDebugFreeMemFinish
그 수단이라고 블록은 해제되었다. OnMemoryLeak
이벤트 가 없습니다 . 그런 이벤트는있을 수 없습니다. FastMM이하는 일은 종료시 해제되지 않은 모든 블록이 누출되어야 함을 결정하는 것입니다. 그 이전에는 누출을 감지 할 수 없습니다.
AppendEventLog
내가 의심하는 FastMM 소스를 수정해야한다는 것입니다.