Einzelnen Beitrag anzeigen

Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#1

Memoryleak bei dynamischen Forms ?

  Alt 28. Jun 2007, 06:47
Ich hab hier ein kleines Testprogramm geschrieben, das, neben dem Hauptformular, mehrere Unterformulare hat (mit je einem Riesenbild zur Verdeutlichung ).

Diese Unterformulare werden im Hauptform per Listbox ausgewählt und per Buttonclick dynamisch erzeugt:

Delphi-Quellcode:
  procedure THauptformular.Showform(Item:integer);
  begin
    case item of
       0 : begin
             form1 := TForm1.Create(self);
             form1.onclose := DoCloseSubForm;
             form1.Tag := item;
             form1.Show;
           end;
       1 : begin
             form2 := TForm2.Create(self);
             form2.OnClose := DoCloseSubForm;
             form2.Tag := item;
             form2.Show;
           end;
       2 : begin
             form3 := TForm3.Create(self);
             form3.onclose := DoCloseSubForm;
             form3.Tag := item;
             form3.Show;
           end;
       3 : begin
             form4 := TForm4.Create(self);
             form4.onclose := DoCloseSubForm;
             form4.Tag := item;
             form4.Show;
           end;
       4 : begin
             form5 := TForm5.Create(self);
             form5.onclose := DoCloseSubForm;
             form5.Tag := item;
             form5.Show;
           end;
       5 : begin
             form6 := TForm6.Create(self);
             form6.onclose := DoCloseSubForm;
             form6.Tag := item;
             form6.Show;
           end;
       6 : begin
             form7 := TForm7.Create(self);
             form7.onclose := DoCloseSubForm;
             form7.Tag := item;
             form7.Show;
           end;
    end;
  end;
Soweit funktioniert das ganze auch wunderbar.

Beim Schließen des Unterformulars wird die Instanz nun wieder freigegeben:

Delphi-Quellcode:
procedure THauptformular.DoCloseSubForm(Sender: TObject;
  var Action: TCloseaction);
begin
  action := caFree;
end;
Das scheint aber nur teilweise zu funktionieren. Lt. Taskmanager bleiben etwa 650Kb stehen und zwar jedesmal, also wenn ich die Unterformulare 5 mal aufrufe, bleiben insgesamt 3250 Kb stehen !!. Wie kommt das und wie kann man das verhindern ?
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat