Einzelnen Beitrag anzeigen

Frank Ranis

Registriert seit: 15. Okt 2008
17 Beiträge
 
#7

AW: Wie erkenne ich eigentlich ein Memory-Leak?

  Alt 9. Feb 2015, 09:03
Hallo,

hatte öfter mal Objekte oder Speicher nicht richtig freigegeben , aber in diversen Schleifen immer wieder neu erzeugt und so ne Menge Leichen erzeugt.
Nun überwache ich meinen aktuellen Speicherbedarf mit 'GetHeapStatus.TotalAllocated' .
Einfach ab und an per Timer abfragen.
Kann man prima in einer Statusbar, fest eingebaut im Programm, ausgeben.
Quelltext und ZIP siehe unten.

Button 1 erzeugt eine Integer-Matrix [100,100].
Button 2 setzt die Matrix auf [0,0] zurück.

Gruß

Frank


Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Button1: TButton;
    ListBox1: TListBox;
    Button2: TButton;
    StatusBar1: TStatusBar;
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  Tint_vektor=array of integer;
  Tint_matrix=array of Tint_vektor;


var
  Form1: TForm1;
  m:tint_matrix;

implementation

{$R *.dfm}

// Speicher-Bedarf-Abfrage
procedure TForm1.Timer1Timer(Sender: TObject);
var Speicherinfo:THeapStatus;
begin
 // Aktuellen Speicherbedarf ausgeben
 speicherinfo:=GetHeapStatus;
 statusbar1.Panels[0].Text:=
              'Aktueller Speicherbedarf='+
              inttostr(speicherinfo.TotalAllocated)+
              ' Byte';
end;

// eine Integermatrix m[100,100] Global erzeugen
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
    s:string;
begin
 listbox1.Clear;
 setlength(m,100,100);
 for i:=0 to 99 do
  begin
   s:='';
   for j:=0 to 99 do
    begin
     m[i,j]:=i*j;
     s:=s+floattostr(m[i,j])+' ';
    end;
   listbox1.Items.Add(s);
  end;
end;

// die Integer-Matrix auf m[0,0] zurücksetzten
procedure TForm1.Button2Click(Sender: TObject);
begin
 setlength(m,0,0);
 listbox1.Clear;
end;

end.
Angehängte Dateien
Dateityp: zip Speicherleck.zip (210,8 KB, 6x aufgerufen)

Geändert von Frank Ranis ( 9. Feb 2015 um 09:26 Uhr)
  Mit Zitat antworten Zitat