Lorsque l'on développe une application, il arrive parfois que l'on fasse des erreurs de programmation générant des fuites de mémoire.
Qu'est ce qu'une fuite de mémoire et comment se produit-elle ?
On est en présence d'une fuite de mémoire lorsqu'une application réserve un ou plusieurs blocs de mémoire et ne les libèrent jamais.
Tant qu'il s'agit d'une petite quantité de mémoire, ça ne pose pas de problème, windows se charge de tout libérer à la fermeture de l'application. Les problèmes arrivent lorsque la fuite de mémoire est exponentielle, par exemple à l'intérieur d'une boucle. Les fuites de mémoire s'accumulent et peuvent aller jusqu'à saturer la mémoire de l'ordinateur, provoquant des bugs dans notre application mais aussi dans les autres applications en cours d’exécution.
Comment détecter une fuite de mémoire ?
Le gestionnaire de mémoire de Delphi peut effectuer un contrôle de la mémoire et faire un compte rendu en fin de programme. Pour cela il faut modifier la valeur de la variable globale ReportMemoryLeaksOnShutdown.
Voici les 3 valeurs à connaître:
ReportMemoryLeaksOnShutdown := False;
ReportMemoryLeaksOnShutdown := DebugHook <> 0 ;
ReportMemoryLeaksOnShutdown := True ;
Avant tout il faut savoir qu'à la compilation, Delphi crée deux versions de l'application et les enregistre dans le répertoire de votre projet.
La version Debug: Dans le répertoire Win32>Debug est destinée à être exécutée sous Delphi.
La version Release: Dans le répertoire Win32>Release est destinée à être distribué.
Donc par défaut ReportMemoryLeaksOnShutdown est égal à False et aucun rapport n'est affiché, même en cas de fuite de mémoire.
En lui donnant la valeur DebugHook<>0, en cas de fuite de mémoire la version Debug de votre application affiche un rapport mais pas la version Release.
Avec la valeur True, en cas de fuite de mémoire, les versions Debug et Release afficherons un rapport.
Cette variable peut être redéfinit à n'importe quel moment dans l'application, cela n'a pas d'importance, sa valeur n'est prise en compte qu'en fin de programme.
Pour vérifier le bon fonctionnement de cette commande, entrez le code suivant dans un Tbutton sur votre formulaire:
procedure TForm1.Button1Click(Sender: TObject);
var ptr : Pointer;
begin
ReportMemoryLeaksOnShutdown := true;
ptr := AllocMem(5000);
end;
A chaque appui du bouton, un nouveau bloc de mémoire sera réservé et jamais libéré. A la fin du programme vous aurez un message du gestionnaire de mémoire vous signalant ces blocs de mémoire perdus.