![]() |
AW: Arbeitsspeicher läuft über - wie leeren
Keine Ahnung, was Windows weiß. Jedenfalls steht der Adressraum eines nicht mehr existierenden, also beendenten Prozesses, wieder zur Verfügung. Oder hast du schon mal im Taskmanger belegten Speicher gesehen, der zu keinem Prozess mehr gehört? ;)
|
AW: Arbeitsspeicher läuft über - wie leeren
@Teekeks
Danke, danke, danke, danke!!!! Ich habe keine Ahnung, warum das auskommentiert war! Aber das war die Lösung. Jetzt komme ich nicht mehr über 10MB - auch nach x-maligen Ausführen!!!! Nocheinmal DANKE - das Ihr drangeblieben bist!!! |
AW: Arbeitsspeicher läuft über - wie leeren
Zitat:
Aber wird nicht immer expliziet darauf hingewiesen, das ich selbst dafür verantwortlich bin, egal ob es ein Record, Objekt oder ein dynamisches Array ist, am Ende dafür zu sorgen, das es auch wieder frei gegeben wird? Dann kann man sich ja am Ende( das aufräumen sparen)
Delphi-Quellcode:
und ich stecke da immer so viel Arbeit rein:wink:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin //freigeben von objekte //dyn. Arrays //records usw. end gruss alfold |
AW: Arbeitsspeicher läuft über - wie leeren
Zitat:
Gern geschehen :) Manchmal sieht man den Wald vor lauter Bäumen nicht :) |
AW: Arbeitsspeicher läuft über - wie leeren
Zitat:
Zitat:
Zitat:
|
AW: Arbeitsspeicher läuft über - wie leeren
Moin,
Zitat:
Zitat:
Nun ist das beim Programmende doch eigentlich so, dass er einfach die Tabelle für den Prozess X verwirft, und die Adresse P nicht mehr benutzt wird. Das da vorher Daten drin waren kann (i.d.R.) egal sein. Notfalls musst du am Anfang den Wert fest definieren. MfG Fabian |
AW: Arbeitsspeicher läuft über - wie leeren
Windows weist dem virtuellen Addressraum des Prozesses reellen Speicher zu, wenn eswas angefordert wird (
![]() und beim Beendes des Prozesses werden diese Zuweisungen einfach wieder freigegeben, es sei denn man hat den Speicher ge-shared und andere Prozesse haben auch noch eine Zuweisung ... Windows weiß also was welchem Prozess zugewiesen wurde. SetLength führt Finalize/FinalizeArray und Initialize/InitializeArray für alle reservierten und freizugebenden Arrayfelder aus. dynamische Arrays besitzen eine automatischen Speicherverwaltung/Initialisierung (ebenso wie Strings und Interfaces). Wenn man also bei einem mehrdimensionalen Array das äußere Array freigibt, dann werden über Finalize die untergeordneten Arrays mit freigegeben. Wärend der Programmlaufzeit muß man sich also "nur" um die nicht automatisch behandelten Speicheranfragen kümmer, wie Pointer und Objekte. Wird ein Prozess beendet, dann räumt Windows auf ... gerade deswegen wurde ja mit der WinNT-Serie die virtuelle Speicherverwaltung eingeführt. - Windows weiß wem was gehört und kann damit auch ordentlich aufräumen - Prozesse haben getrennte Speicherräume und können sich nicht einfach gegenseitig beeinflussen (früher konnte ein BufferOverrun auch schonmal einen fremden Prozess schrotten und nicht nur den Eigenen). |
AW: Arbeitsspeicher läuft über - wie leeren
Also ich habe jetzt noch Augenschmerzen vom Lesen des Sourcecode von Beitrag #7. :P
Bitte verwende doch eigene Prozeduren und Funktionen - dieser Spaghetticode ist ja nicht zum aushalten. Auch wenn ein bestimmter Codeabschnitt nur einmal verwendet wird lohnt es sich doch diesen in eine Prozedure oder Funktion (genauer gesagt eine Methode) zu verpacken. |
AW: Arbeitsspeicher läuft über - wie leeren
Jo, soll ja keine grundsatz Diskusion werden:wink:
Zitat:
Alles ander hatte ja @Lucki schon in einem Satz gesagt!:wink: Sonst hat dieses Thema nichts mehr mit den Topic zu tun! Gruss alfold |
AW: Arbeitsspeicher läuft über - wie leeren
Noch eine Bemerkung zum Aufräumen.
Ich hab das Gefühl, daß das Windows-Aufräumen etwas langsamer von Statten geht, als wenn Du es selbst machst. Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:20 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