New & Dispose

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Reinhard
Beiträge: 46
Registriert: Fr 26. Sep 2008, 16:56

New & Dispose

Beitrag von Reinhard »

Hallo, ich habe da folgendes Problem und werde nicht ganz schlau daraus.

Wenn ich den Befehl "New" zum Erzeugen eines Pointers auf mein Record öfter aufrufe - sagen wir mal 2x - , und beim Beenden des Programms den Befehl
"Dispose" verwende bekomme ich ein "Speicherleck".

Ich kann aber nur 1x "Dispose" aufrufen weil danach ist die Variable ja schon frei, ein erneuter Aufruf von Dispose führt zu einer Exception.

Ich muss aber öfter ein "new" machen damit ich mehrere records von diesen Typ habe.

Das ganze sieht so aus :

Code: Alles auswählen

 
 TForm1 = class(TForm)
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
  Type
     pLanguageInfo = ^tLanguageInfo;
 
     tLanguageInfo = Record
     Path:String;
     Name:String;
     Date:String;
     Hint:String;
     end;
 
var
  Form1: TForm1;
  Test : pLanguageInfo; 
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
     Dispose(Test);
 
end;
 
procedure TForm1.FormShow(Sender: TObject);
begin
     New(Test);
     Test^.Path:='123';
     Test^.Name:='1.Eintrag';
     New(Test);
     Test^.Path:='456';
     Test^.Name:='2.Eintrag';
end;
 

Beim Beenden des Prgrammes (m Debug Modus) bekome ich dann :

Heap dump by heaptrc unit
894 memory blocks allocated : 1544101/1545688
893 memory blocks freed : 1544085/1545672
1 unfreed memory blocks : 16
True heap size : 622592
True free heap : 622496
Should be : 622512
Call trace for block $B7FC7C20 size 16
$080878CC
$08086D30
$0806FFE6
$081C75E0
$08088707
$081D24E6
$081C5369
$081C52D1

Wenn ich nur 1x new mach und danach das dispose bekomme ich kein Speicherleck.

Was mache ich da bitte falsch ?
Zuletzt geändert von Lori am Di 14. Okt 2014, 19:26, insgesamt 1-mal geändert.
Grund: Highlighter

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: New & Dispose

Beitrag von wp_xyz »

Wenn du zwei Variablen benötigst, musst du ihnen natürlich verschiedene Namen geben:

Code: Alles auswählen

 
var
  Test1 : pLanguageInfo;
  Test2 : pLanguageInfo;
 
procedure TForm1.FormShow(Sender: TObject);
begin
  New(Test1);
  Test1^.Path:='123';
  Test1^.Name:='1.Eintrag';
  New(Test2);
  Test2^.Path:='456';
  Test2^.Name:='2.Eintrag';
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  Dispose(Test1);
  Dispose(Test2);
end;
 

P.S. Du machst geposteten Code für uns (und auch dich) lesbarer, indem du in mit den Tags [ code=laz ] und [ /code ] umgibts (Ohne Leerzeichen nach [ und vor ], die ich hier einfügen muss, damit die Forumsoftware nicht durcheinander kommt).

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: New & Dispose

Beitrag von Michl »

Aufpassen müsstest Du auch, dass OnShow und OnDestroy (vom Formular) unterschiedlich oft aufgerufen werden können.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

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

Re: New & Dispose

Beitrag von Mathias »

Aufpassen müsstest Du auch, dass OnShow und OnDestroy (vom Formular) unterschiedlich oft aufgerufen werden können.

Anstelle von OnShow, würde ich OnCreate nehmen, die wird genau einmal aufgerufen, wie am Ende OnDestroy.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Reinhard
Beiträge: 46
Registriert: Fr 26. Sep 2008, 16:56

Re: New & Dispose

Beitrag von Reinhard »

Danke, hat geholfen.

Antworten