Je suis en train d'essayer de détecter si un bloc de mémoire n'était pas libérée. Bien sûr, le gestionnaire m'a dit que par la boîte de dialogue ou un fichier journal, mais si je voudrais stocker les résultats dans une base de données? Pour exemple, j'aimerais avoir dans une table de base de données un des noms de routines qui a alloué donné des blocs.
Après la lecture d'une documentation de FastMM je sais que depuis la version 4.98 nous avons une possibilité d'être informé par le gestionnaire sur les allocations de mémoire, libère et réaffectations à mesure qu'ils surviennent. Par exemple OnDebugFreeMemFinish
événement est de passage pour nous un PFullDebugBlockHeader
qui contient des informations utiles.
Il y a une chose qu' PFullDebugBlockHeader
manque de l'information si le bloc a été libéré par l'application.
À moins d' OnDebugFreeMemFinish
n'est appelé que pour ne pas libéré des blocs? C'est que je ne sais pas et que vous souhaitez trouver.
Le problème, c'est que même l'accrochage en OnDebugFreeMemFinish
événement que j'étais incapable de savoir si le bloc a été libéré ou non.
Voici un exemple:
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.
Ce que je suis en manque, c'est le rappel comme:
procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
Après avoir profité de la source de FastMM, j'ai vu qu'il y a une procédure à suivre:
procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean);
ce qui pourrait être changé, mais peut-être il ya un moyen plus facile?