메모리 블록이 해제되지 않았는지 감지하려고합니다. 물론 관리자가 대화 상자 나 로그 파일을 통해 나에게 결과를 데이터베이스에 저장하고 싶다면 어떻게할까요? 예를 들어 주어진 테이블을 할당 한 루틴의 이름을 데이터베이스 테이블에 갖고 싶습니다.특정 블록의 메모리가 FastMM에 의해 해제되지 않았는지 프로그래밍 방식으로 알 수 있습니까?
FastMM에 대한 문서를 읽은 후 버전 4.98부터 관리자가 메모리 할당, 해제 및 재 할당에 대한 알림을받을 수 있음을 알고 있습니다. 예를 들어 OnDebugFreeMemFinish
이벤트는 유용한 정보가 포함 된 PFullDebugBlockHeader
으로 전달됩니다. PFullDebugBlockHeader
이 누락 된 한 가지가 있습니다. 해당 블록이 응용 프로그램에 의해 해제 된 경우의 정보입니다.
해제되지 않은 블록에만 OnDebugFreeMemFinish
이 호출되지 않으면? 이것은 내가 모르고 알아 내고 싶습니다.
문제는 심지어 OnDebugFreeMemFinish
이벤트에 연결되어있어 차단 해제 여부를 확인할 수 없었습니다.
procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean);
: 나는 과정이 있음을 보았다 FASTMM의 원인을 탐색 한 후
procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
:
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.
내가 놓친 것은 같은 콜백은 다음과 같습니다
은 예입니다오버라이드 될 수 있지만 더 쉬운 방법이 있을까요?
적절한 설정으로 전체 FastMM을 사용하면 시스템 종료시 유출 된 모든 블록에 대한 자세한 보고서를 받게됩니다. 이것이 당신의 필요에 충분하지 않습니까? –
아니오, 필자가 썼습니다. "누출은 응용 프로그램을 닫을 때 예상대로보고됩니다."그리고 이것은 원하지 않습니다. 나 혼자서 기록하고 싶다. – Wodzu
필자는 항상 FastMM이 프로그램이 정의해야하는 매우 최종적인 작업으로 만이 검사를 수행 할 수 있음을 이해했습니다. 따라서 FastMM이 보고서 작성을 마칠 때까지 코드가 완료됩니다. 부분적인 해결책을 얻으려면 할당 된 메모리에 플래그가 지정되었는지 확인하기 위해 항상 소스를 살펴볼 수 있습니다. –