![]() |
Fenster/Formular aus Speicher entfernen
Hallo Delphi-Fans,
ich habe eine Frage zur Speicherverwaltung und damit zum ordentlichen Freigeben von Speicher. Folgendes Problem: Ich öffne von einem Hauptformular aus ein zweites Formular/Fenster. In den Projektoptionen liegt das Formular nicht unter den automatisch erzeugten Formularen. Also öffne und schließe ich es mit:
Delphi-Quellcode:
Nehme ich jetzt z.B. ein Speicherüberwachungstool, wie WinHex (
EingabeDlg := TEingabeDlg.Create(Self);
If EingabeDlg.ShowModal = mrOK then begin // ............. end; EingabeDlg.Release; FreeAndNil(EingabeDlg); ![]() Auch wenn ich in dem Formular Variablen mit Werten fülle, finde ich diese noch im Speicher. Ist meine Routine nicht ganz in Ordnung? Wie kann ich sicherstellen, dass der Speicher wirklich freigegeben wird? Gibt es einen Trick oder eine Einstellung in den Delphi-Optionen? Bin über jede Antwort dankbar. Gruß Amigage |
Re: Fenster/Formular aus Speicher entfernen
Der Delphi Speichermanager gibt nicht sofort den Speicher an Windows zurück, damit er ihn beim nächsten mal nicht neu anfordern muss, das spart Zeit. Der Delphi Speichermanager uist deswegen so ausgelegt, weil in der OOP Programmierung häufig belegt und wieder freigegeben werden, somit ist die Vorgehensweise des Speichermanagers performanter, als wenn er jedes mal den Speicher an Windows zurück geben und wieder neu anfordern würde.
|
Re: Fenster/Formular aus Speicher entfernen
Danke für die schnelle Antwort.
Bei datenkritischen Anwendungen ist das natürlich ein eklatanter Nachteil. Gibt es wirklich keine Möglichkeit, die Speicherfreigabe zu erzwingen? Gruß Amigage |
Re: Fenster/Formular aus Speicher entfernen
Hallo,
das Problem hier ist nicht die Speicherfreigabe. Selbst wenn Speicher freigegeben wird, wird dieser nicht "geleert", also z. B. mit Null gefüllt. Wenn Du Dir z. B. die Auslagerungsdatei einer (nicht laufenden) Windows-Installation im Hex-Editor ansiehst, wirst Du erstaunt sein, was da alles drinsteht. Das Leeren des Speichers bringt ja normalerweise nichts und kostet nur Zeit. Du musst also vor dem Zerstören Deines Objekts (am Besten im Destructor) Deinen Daten selbst überschreiben (einen String auf '' setzten funktioniert übrigens nicht, ist ja nur ein Pointer). Aber selbst das ist keine Garantie, dass die Daten nicht auch noch in der Auslagerungsdatei rumfliegen. Gruß xaromz |
Re: Fenster/Formular aus Speicher entfernen
Entweder du schreibst dir selber einen MemoryManager, denn die meisten MMs gehen ähnlich vor.
Oder du wendest dich direkt an Windows und forderst dort Speicher an und gibst ihn wieder frei. z.B. mit > GlobalAlloc, GlobalReAlloc, GlobalFree oder > VirtualAlloc, VirtualFree Was aber bei einem Fenster nicht gehen wird, da du dort ja nichts an den Aufrufen ändern kannst. [add] Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 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