Table des matières

HeapTrc et gestion de la mémoire

HeapTrc permet de détecter des éventuelles “fuites” de mémoire lors du débuggage.

HeapTrc

Activation

Dans Options pour le Projet, partie Débogage, cocher la case Utiliser l'unité HeapTrc

Résultat

A la fin de l'execution du programme on obtient une fenetre de ce style O unfreed memory blocks : 0 = OK tout va bien !

Améliorations

N'Afficher que si il y a des erreurs

Si vous ne voulez pas voir la fenêtre de sortie quand tout va bien, juste quand il y a des erreurs, il vous faudra mettre ce bout de code dans le fichier .lpr de votre projet

  {$if declared(useHeapTrace)}
  	globalSkipIfNoLeaks := true;
  {$endIf}

Vue d'ensemble :

MonProg.lpr
program MonProg;
 
{$mode objfpc}{$H+}
 
uses
 {$IFDEF UNIX}
 {$IFDEF UseCThreads}
  cthreads,
 {$ENDIF}
 {$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms,
  uMainForm;
 
{$R *.res}
 
begin
  {$if declared(useHeapTrace)}
  	globalSkipIfNoLeaks := true;
  {$endIf}
  RequireDerivedFormResource := True;
  Application.Scaled := True;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.                 

THeapStatus

THeapStatus sert a récuperer les infos sur la mémoire utilisée par le programme

Déclaration

dans l'unité (???) heaph.inc

  THeapStatus = record
    TotalAddrSpace: Cardinal;
    TotalUncommitted: Cardinal;
    TotalCommitted: Cardinal;
    TotalAllocated: Cardinal;
    TotalFree: Cardinal;
    FreeSmall: Cardinal;
    FreeBig: Cardinal;
    Unused: Cardinal;
    Overhead: Cardinal;
    HeapErrorCode: Cardinal;
  end;

Utilisation

Var 
  FHeap:    THeapStatus; 
 
procedure TForm1.WriteHeapStatus;
begin
   FHeap := GetHeapStatus; // A appeler à chaque fois que l'on veut lire les données
   writeln(format('TotalAllocated:%d (%d)', [FHeap.TotalAllocated, FHeap.TotalAllocated - FLastAllocated]));
   writeln(format('TotalFree:%d (%d)', [FHeap.TotalFree, FHeap.TotalFree - FLastFree]));
   FLastFree      := FHeap.TotalFree;
   FLastAllocated := FHeap.TotalAllocated;
end;

Voir aussi