Sto cercando di rilevare se un blocco di memoria non è stato liberato. Ovviamente, il manager me lo dice tramite la finestra di dialogo o il file di registro, ma cosa succede se volessi memorizzare i risultati in un database? Ad esempio, vorrei avere in una tabella di database i nomi delle routine che allocano determinati blocchi.
Dopo aver letto una documentazione di FastMM, so che dalla versione 4.98 abbiamo la possibilità di essere avvisati dal manager sulle allocazioni di memoria, sui liberi e sulle riallocazioni quando si verificano. Ad esempio ci OnDebugFreeMemFinishsta passando un evento PFullDebugBlockHeaderche contiene informazioni utili. C'è una cosa che PFullDebugBlockHeadermanca: le informazioni se il blocco specificato è stato liberato dall'applicazione.
A meno che non OnDebugFreeMemFinishvenga chiamato solo per blocchi non liberati? Questo è quello che non so e vorrei scoprire.
Il problema è che anche agganciando OnDebugFreeMemFinishall'evento non sono riuscito a scoprire se il blocco è stato liberato o meno.
Ecco un esempio:
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.
Quello che mi manca è il callback come:
procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
Dopo aver sfogliato i sorgenti di FastMM ho visto che esiste una procedura:
procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean);
quale potrebbe essere sovrascritto, ma forse c'è un modo più semplice?
OnDebugFreeMemFinishviene chiamato significa che il blocco è stato liberato. Non ci sono OnMemoryLeakeventi. Non potrebbe mai esserci un simile evento. Quello che fa FastMM è, all'arresto, determinare che tutti i blocchi che non sono stati liberati devono essere perdite. Non è in grado di rilevare una perdita prima di allora.
AppendEventLogma è necessario modificare la fonte FastMM che sospetto.