Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fenster/Formular aus Speicher entfernen (https://www.delphipraxis.net/67737-fenster-formular-aus-speicher-entfernen.html)

amigage 19. Apr 2006 08:46


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:
EingabeDlg := TEingabeDlg.Create(Self);
If EingabeDlg.ShowModal = mrOK then
begin
 // .............
end;
EingabeDlg.Release;
FreeAndNil(EingabeDlg);
Nehme ich jetzt z.B. ein Speicherüberwachungstool, wie WinHex (http://www.x-ways.net/winhex/index-d.html) und lasse mir über das Menü EXTRAS - RAM ÖFFNEN den Gesamtspeicher meines Programms anzeigen, finde ich trotzdem noch die Eingabefelder und Labelbezeichner im Speicher!

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

Luckie 19. Apr 2006 08:54

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.

amigage 19. Apr 2006 09:44

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

xaromz 19. Apr 2006 09:48

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

himitsu 19. Apr 2006 09:52

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:

Aber selbst das ist keine Garantie, dass die Daten nicht auch noch in der Auslagerungsdatei rumfliegen.
Ist ja auch klar, denn der Speicherberaich wird ja vorm Ändern wieder vom Windows in den RAM geladen und dort geändert, also das was in der PageFile steht wird erst gelöscht, wenn mal wieder etwas anderes ausgelagert und an der selben Stelle abgespeichert wird.


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