Diese Frage machte mich neugierig. Fragen wie diese bekommen immer Antworten wie "Es ist generell sicher, aber du solltest nicht davon ausgehen, dass das OS das für dich tun wird", was für mich ein guter Rat ist, aber ich frage mich: Gibt es ein aktiv entwickeltes (released) Betriebssysteme, die das nicht tun?
Ist das etwas, das im Zeitalter der Dinosaurier (80er Jahre) repariert wurde?
Kurze Antwort ist "keine". Selbst ein DOS-Programm vor Jahren würde Speicher beim Beenden des Programms freigeben (einfach dadurch, dass nichts den Speicher verwaltet, als das Programm gestoppt wurde). Ich bin mir sicher, dass jemand sehen könnte, dass der Kernelmodus-Code nicht unbedingt seinen Speicher beim App-Exit freigibt oder dass er ein obskures Embedded-Betriebssystem anführt .... aber Sie können davon ausgehen, dass app-exit den gesamten von Ihrem Benutzermoduscode abgerufenen Speicher zurückgibt . (Windows 3.x könnte dieses Problem haben, je nachdem welcher Zuordner verwendet wurde ...)
Der Grund für die Tugend, dass Sie "Ihr Gedächtnis freigeben sollten", ist, dass Sie bei der Entwicklung von Software im großen Maßstab Komponenten entwickeln sollten, die flexibel einsetzbar sind, weil Sie nie wissen, wie jemand anders die Verwendung von Software ändern wird Ihr Code lange nachdem Sie das Team verlassen haben.
Denken Sie so darüber nach. Angenommen, Sie entwerfen eine Klasse, die als Singleton (nur einmal während der App-Lebensdauer instanziiert) entworfen wurde. Daher entscheiden Sie, sich nicht mit der Speicherbereinigung zu befassen, wenn Ihre Komponente zerstört oder finalisiert wird. Das ist eine perfekte Entscheidung für diesen Moment. Jahre später, nachdem du auf grünere Weiden gegangen bist, kann jemand anderes mitkommen und entscheiden, dass er deine Klasse an mehreren Orten verwenden muss, so dass viele Instanzen während der App-Lebenszeit kommen und gehen. Ihr Speicherverlust wird ihr Problem werden.
In meinem Team haben wir oft darüber gesprochen, den Benutzer dazu zu bringen, die Anwendung "close" zu initiieren, einfach exit (), ohne eine Bereinigung vorzunehmen. Wenn wir das jemals tun würden, würde ich immer noch erzwingen, dass das Team Klassen und Komponenten entwickelt, die sich selbst sauber machen.
In CP / M ging es nicht darum, Speicher freizugeben, da Sie für Ihr Programm einen statischen RAM-Bereich hatten und jedes Programm im gleichen Bereich lief. Also, wenn Programm A beendet wurde und Programm B lief, wurde B einfach über A geladen.
Jetzt gab es Mechanismen, um Speicher vom Betriebssystem zu reservieren, aber das war normalerweise kein Heap-Speicher (im klassischen Fall, dass wir es heute betrachten), es war spezielle reservierte Bereiche für verschiedene Aufgaben.
Zum Beispiel hatte DOS diese Exit-Routine "Terminate and Stay Resident" genannt. Dies "beendet" das Programm, gibt aber den Speicherplatz nach dem Beenden des Programms nicht frei. In der Regel luden diese Programme Interrupt-Vektoren (wie Tastatur-Interrupts) auf, um Routinen auszulösen. Borland Sidekick war damals eine sehr beliebte "TSR" und bot Dinge wie einen Taschenrechner und eine Kontaktliste an.
Schließlich, da dies keine geschützten Speichersysteme waren, könnten Ihre Programme das System auf alle möglichen Arten missbrauchen, um das zu tun, was Sie wollen, aber das ist eine andere Diskussion.
Kein neuartiges unixartiges Betriebssystem kann nicht den gesamten Prozessspeicher freigeben, wenn ein Prozess beendet wird, wobei letzteres wahrscheinlich "seit 1970 oder so" bedeutet. Ich bin ziemlich sicher, dass sehr alte PC-Betriebssysteme wie DOS und CP / M dieses Problem hatten, und einige ältere Versionen von Windows. Ich weiß zwar nicht genug über das aktuelle Windows, aber ich wäre sehr überrascht, wenn Windows XP, Vista oder Windows 7 Probleme beim Freigeben des Prozessspeichers hätten.
Als Faustregel würde ich vorschlagen, dass jedes Betriebssystem, das keinen virtuellen Speicher verwendet, um Prozessen separate Adressräume zu geben, anfällig dafür ist, Speicher auszulaugen, wenn Prozesse auf wesentliche Weise fehlschlagen. Sobald ein os pro-process virtuelle Adressräume implementiert hat, muss es bereits den gesamten physischen Speicher verfolgen, der einem Prozess ohnehin zugewiesen ist. Daher ist es einfach, es freizugeben.
Alles in allem ist es oft eine gute Idee, Ihre Programme so zu schreiben, dass sie sich selbst aufräumen. Es führt tendenziell zu besser gestalteten Subkomponenten und erleichtert außerdem die Anwendung von Tools, die nach Speicherlecks und ähnlichem suchen.
Tags und Links memory-management operating-system