Heap ermitteln

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6207
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Heap ermitteln

Beitrag von Mathias »

Ich will prüfen, ob ich schon brav mein Heap wieder frei gebe. Dazu habe ich folgendes probiert, aber es kommt überall "0".

Code: Alles auswählen

var
  status: TFPCHeapStatus;
  p: Pointer;
begin
  status := GetFPCHeapStatus;
  WriteLn('Free:', status.CurrHeapFree);
  WriteLn('Size:', status.CurrHeapSize);
  WriteLn('Used:', status.CurrHeapUsed);
  Getmem(p, 1024);
  WriteLn('Free:', status.CurrHeapFree);
  WriteLn('Size:', status.CurrHeapSize);
  WriteLn('Used:', status.CurrHeapUsed);
end.         
Was mache ich falsch ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6213
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Heap ermitteln

Beitrag von af0815 »

Nur eine Zusatzfrage - welche Plattform ? Win/Linux/Embedded ?
Zuletzt geändert von af0815 am Mi 9. Nov 2022, 14:03, insgesamt 2-mal geändert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Mathias
Beiträge: 6207
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Heap ermitteln

Beitrag von Mathias »

af0815 hat geschrieben:
Mi 9. Nov 2022, 14:01
Nur eine Zusatzfrage - welche Plattform ? Win/Linux/Embedded ?
Linux 64Bit.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6213
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Heap ermitteln

Beitrag von af0815 »

Die Frage ist, ob der FPCHeapStatus der richtige ist oder eher THeapStatus mit GetHeapStatus https://www.freepascal.org/docs-html/rt ... tatus.html
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: Heap ermitteln

Beitrag von theo »

Beim mir geht das auf Lazarus 2.3.0 (rev main-2_3-2199-g898f4009c0) FPC 3.2.2 x86_64-linux-gtk2
Hab's allerdings in ein Formular gelegt.
Du musst natürlich ein zweites Mal GetFPCHeapStatus abfragen:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  status,status2: TFPCHeapStatus;
  p: Pointer;
begin
  status := GetFPCHeapStatus;
  WriteLn('Free:', status.CurrHeapFree);
  WriteLn('Size:', status.CurrHeapSize);
  WriteLn('Used:', status.CurrHeapUsed);
  Getmem(p, 1024);
  status2 := GetFPCHeapStatus;
  WriteLn('Free:', status2.CurrHeapFree);
  WriteLn('Size:', status2.CurrHeapSize);
  WriteLn('Diff:', status2.CurrHeapUsed-status.CurrHeapUsed);
end;     
Free:1759072
Size:2326528
Used:567456
Free:1758016
Size:2326528
Diff:1056

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Heap ermitteln

Beitrag von PascalDragon »

Mathias hat geschrieben:
Mi 9. Nov 2022, 13:54
Ich will prüfen, ob ich schon brav mein Heap wieder frei gebe. Dazu habe ich folgendes probiert, aber es kommt überall "0".
Nutze nicht Get(FPC)HeapStatus, sondern kompiliere deine Anwendung stattdessen mit -gh, was die HeapTrc Unit aktiviert. Get(FPC)HeapStatus ist ein Überbleibsel aus der TP Zeit und berichtet eventuell nicht den wirklichen Zustand des Heaps. HeapTrc andererseits meldet sich beim Programmende, wenn du was nicht freigegeben hast.
FPC Compiler Entwickler

Mathias
Beiträge: 6207
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Heap ermitteln

Beitrag von Mathias »

Code: Alles auswählen

44 memory blocks allocated : 3122/3208
44 memory blocks freed     : 3122/3208
0 unfreed memory blocks : 0
True heap size : 131072
True free heap : 131072
So wie es scheint, habe ich in meinem Klassengewurstelt sauber aufgeräumt. :shock:
Mit der Unit HeapTrc geht es super.
Get(FPC)HeapStatus ist ein Überbleibsel aus der TP Zeit
Ich habe es einem FreeVison-Programm abgeguckt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Heap ermitteln

Beitrag von PascalDragon »

Mathias hat geschrieben:
Do 10. Nov 2022, 15:34
Get(FPC)HeapStatus ist ein Überbleibsel aus der TP Zeit
Ich habe es einem FreeVison-Programm abgeguckt.
Und die meisten existierenden FreeVision Anwendungen stammen aus der TP Zeit...
FPC Compiler Entwickler

Antworten