AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Wie erkenne ich eigentlich ein Memory-Leak?

Wie erkenne ich eigentlich ein Memory-Leak?

Ein Thema von pelzig · begonnen am 8. Feb 2015 · letzter Beitrag vom 9. Feb 2015
Antwort Antwort
Frank Ranis

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

AW: Wie erkenne ich eigentlich ein Memory-Leak?

  Alt 9. Feb 2015, 10:02
Hallo himitsu,

OK das mit dem Array war jetzt ein doofes Besipiel, wollte ja nur den aktuell benutzen Speicherbedarf ausgeben.

Nehmen wir das folgende Beispiel:

Ich habe zwei Buttons.
Mit Button3 erzeuge ich ein BMP.
Mit Button4 kille ich es wieder.

Drücke ich aber zwei oder noch mehr mal auf Button3, dann habe ich Bitmap-Leichen erzeugt, an die ich nicht mehr rannkomme.
Das kann man dann schön an der Anzeige 'Aktueller Speicherbedarf' sehen.
Ich komme dann nicht mehr auf den Speicher-Wert, den das Programm beim Starten hatte.

Gruß

Frank

Delphi-Quellcode:
unit Unit1;

interface

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

type

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

  TForm1 = class(TForm)
    Timer1: TTimer;
    StatusBar1: TStatusBar;
    Button3: TButton;
    Button4: TButton;
    procedure Timer1Timer(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
   bmp:tbitmap;
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

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;

// Bitmap erzeugen
procedure TForm1.Button3Click(Sender: TObject);
begin
 bmp:=tbitmap.Create;
end;

// Bitmap killen
procedure TForm1.Button4Click(Sender: TObject);
begin
 if bmp<>nil
  then
   begin
    bmp.Free;
    bmp:=nil;
   end;
end;

end.
Angehängte Dateien
Dateityp: zip Speicherleck2.zip (204,1 KB, 0x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.399 Beiträge
 
Delphi 12 Athens
 
#2

AW: Wie erkenne ich eigentlich ein Memory-Leak?

  Alt 9. Feb 2015, 10:25
Delphi-Referenz durchsuchenReportMemoryLeaksOnShutdown
http://www.delphipraxis.net/183846-f...nshutdown.html

PS:
.Free prüft intern bereits auf Self<>nil, bzw. aus Assigned(Self).
Und deine Prüfung geht kaputt, wenn es im Free knallt und dann kein nil gesetzt wird.

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
begin
  Button4Click(nil); // Aufräumfunktion aufrufen, oder direkt FreeAndNil(bmp);
  bmp := TBitmap.Create;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  FreeAndNil(bmp);
end;

procedure TForm1.Form1Close(Sender: TObject);
begin
  Button4Click(nil); // Aufräumfunktion aufrufen, oder direkt FreeAndNil(bmp);
end;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 9. Feb 2015 um 10:32 Uhr)
  Mit Zitat antworten Zitat
Frank Ranis

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

AW: Wie erkenne ich eigentlich ein Memory-Leak?

  Alt 9. Feb 2015, 12:49
Hallo himitsu,


Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
begin
  FreeAndNil(bmp);
end;
Ok , das ist nun aber ein Problem meiner Programmierung.

Ich wollte doch nur zeigen, wie man Leichen produzieren kann, wenn man die Objekte nicht wieder richtig frei gibt.
Und das man das dann mit 'GetHeapStatus.TotalAllocated' auf einfache Weise sehen kann, wenn sich der Speicherbedarf unerklärlich erhöht.

Wo man den Fehler gemacht hat , sieht man natürlich nicht.

Gruß

Frank
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.399 Beiträge
 
Delphi 12 Athens
 
#4

AW: Wie erkenne ich eigentlich ein Memory-Leak?

  Alt 9. Feb 2015, 12:52
FastMM im FullDebugMode speichert die Rücksprungadresse des Aufrufs, also quasi die Adresse derjenigen, der den Speicher angefordert hatte.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz