![]() |
prüfen, ob dyn. zur Runtime erzeugte Form Speicher freigibt?
Eine Form wird zur Laufzeit erzeugt, mit
Delphi-Quellcode:
Jetzt will ich wissen, ob der Speicher tatsächlich freigegeben wird, sofern ich die Form schließe. Ich bräuchte also für den Fall der Fälle (auch für anderes) den momentan freien Speicher.
MyForm := TMyForm.Create (self);
|
Re: prüfen, ob dyn. zur Runtime erzeugte Form Speicher freig
Kuck dir mal GetHeapStatus an. Damit kannst du selber etwas bauen. Oder es gibt für Delphi auch so Experts mit denen man Memory-Leaks aufspüren kann. Mir fällt leider im Moment keiner ein.
|
Re: prüfen, ob dyn. zur Runtime erzeugte Form Speicher freig
Ich noch mal. Also kucken wir mal:
Delphi-Quellcode:
Hier wird der Speicher von Form2 bestimmt wieder freigegeben.
var
NewFormModal, NewFormNotModal: TForm; procedure TForm1.Button1Click(Sender: TObject); begin NewFormModal := TForm2.Create(self); try NewFormModal.ShowModal; finally FreeAndNil(NewFormModal); end; end; Anders sieht es hier aus:
Delphi-Quellcode:
Jetzt ist die Frage, ob das Close in Form zwei die Form auch wieder aus dem Speicher schmeißt.
procedure TForm1.Button2Click(Sender: TObject);
begin NewFormNotModal := TForm2.Create(self); NewFormNotModal.Show; end; Testen wir das mal:
Delphi-Quellcode:
Form2 wird hier nur erzeugt, wenn die Objektvariable nicht nil ist. Folglich kann man die neue Form auch nur einmal erzeugen. Jetzt der Test, schließt man Form2 mit Close, kann liefert Assigned immer noch true.
procedure TForm1.Button2Click(Sender: TObject);
begin if not Assigned(NewFormNotModal) then begin NewFormNotModal := TForm2.Create(self); NewFormNotModal.Show; end; end; Daraus lassen sich jetzt zwei Schlüsse ziehen: Entweder wird der Speicher freigegeben und der Zeiger nicht auf Nil gesetzt. Was ich für unwahrscheinlich halte. Ich denke, die Borländer hätten dann auch den Zeiger genillt. Oder aber der Speicher wird nicht wieder freigegeben. Selbst ein
Delphi-Quellcode:
im OnClose der Form2 ändert nichts an obigen verhalten.
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin Action := caFree; end;
Delphi-Quellcode:
Endet mit einer AccessViolation.
procedure TForm2.Button1Click(Sender: TObject);
begin Close; FreeAndNil(Unit1.NewFormNotModal); end; So weit meine Untersuchungen. Leider bin ich zu keinem vernünftigem Ergebnisgekommen. :? |
Re: prüfen, ob dyn. zur Runtime erzeugte Form Speicher freig
Als Hansa seinen 2. (oder war's schon der 3. :gruebel: ) Thread zum Thema dyn. Forms aufgemacht hat, habe ich mir ein Form ertellt, lauter Komponenten draufgezogen (ListView, SynMemo, Memo, Edit,...) + 2 Buttons.
Der erste erzeuge 500 Instanzen von der Form, der 2. hat sie wieder entfernt. Vorher waren es 7 MB Speichernutzung, mit 501 Forms etwa 50MB und nach dem Löschen etwa 9MB. Ich habe zum entfernen der Forms "Close" verwendet und im OnClose stand "Action := caFree". |
Re: prüfen, ob dyn. zur Runtime erzeugte Form Speicher freig
Zitat:
|
Re: prüfen, ob dyn. zur Runtime erzeugte Form Speicher freig
Stimmt auch wieder. Und wie sieht es nun aus? Meine Testreihe ist ja damit hinfällig.
|
Re: prüfen, ob dyn. zur Runtime erzeugte Form Speicher freig
Zitat:
|
Re: prüfen, ob dyn. zur Runtime erzeugte Form Speicher freig
So. Habe es getestet. das:
Delphi-Quellcode:
hinterläßt ein Speicherleck. TForm.Close gibt also keinen Speicher frei.
procedure TForm1.Button2Click(Sender: TObject);
begin NewFormNotModal := TForm2.Create(self); NewFormNotModal.Show; end; |
Re: prüfen, ob dyn. zur Runtime erzeugte Form Speicher freig
war mir so als ob es so sei, dass wenn man irgendwo "Create" schreibt, man immer auch "Free" bzw. "FreeAndNil" schreiben muß (sogenannte "Wer A sagt muß auch B sagen - Regel") ?
|
Re: prüfen, ob dyn. zur Runtime erzeugte Form Speicher freig
Nur wo willst du ein nicht modales Form freigeben? In der gleichen Prozedur geht nicht, dann wird es erst gar nicht angezeigt. Also wo?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:51 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 by Thomas Breitkreuz