Wird beim Beenden des Programms durchgesickerter Speicher freigegeben?

117

Wenn ich - ohne es zu wissen - einen Speicherverlust programmiert habe und die Anwendung beendet wird, wird der durchgesickerte Speicher freigegeben?

Martijn Courteaux
quelle
Sehr sehr nützliche, verwandte Antwort: unix.stackexchange.com/questions/275184/…
Gabriel Staples

Antworten:

150

Ja, ein "Speicherverlust" ist einfach ein Speicher, auf den sich ein Prozess nicht mehr bezieht und der daher nicht mehr freigegeben werden kann. Das Betriebssystem verfolgt weiterhin den gesamten einem Prozess zugewiesenen Speicher und gibt ihn frei, wenn dieser Prozess beendet wird.

In den allermeisten Fällen wird das Betriebssystem den Speicher freigeben - wie dies bei normalen "Varianten" von Windows, Linux, Solaris usw. der Fall ist. Es ist jedoch wichtig zu beachten, dass in speziellen Umgebungen wie verschiedenen Echtzeitbetriebssystemen die Der Speicher wird möglicherweise nicht freigegeben, wenn das Programm beendet wird.

Justin Ethier
quelle
4
Frage: Verfolgt das Betriebssystem alle Zuordnungen? Jeder Heap-Speicher, den Sie zuweisen, stammt aus dem virtuellen Speicher des Prozesses. Wenn der Prozess beendet wird, wird dieser Speicher an den Systemgroßhandel zurückgegeben, oder? Ich verstehe nicht, warum die zusätzliche Buchhaltung notwendig wäre, da der Prozess der Zuweisung ohnehin der einzige Prozess (im Benutzerland) ist, der Zugriff auf diese Seiten hat. Oder wurde ich falsch unterrichtet?
Chris Tonkinson
6
@ Justin: Ohne das Betriebssystem zu kennen, denke ich nicht, dass dies gültig ist. Geben Sie möglicherweise explizit das Betriebssystem an, über das Sie sprechen.
Brian R. Bondy
1
Hinweis: Der Standard sagt nichts darüber aus. Es ist auch nicht garantiert. Dies ist die Art und Weise, wie es auf den meisten, wenn nicht allen modernen Betriebssystemen funktioniert, aber sie müssen nicht und in der Vergangenheit gab es solche, die beide üblich waren und diese Bereinigung nicht durchgeführt haben.
Edward Strange
5
Es gibt verschiedene Echtzeitbetriebssysteme für kleine Geräte usw., die keinen durch Lecks verlorenen Speicher zurückfordern. Ihre Frage hängt vom Betriebssystem ab, über das Sie sprechen.
Brian Neal
14
Selbst bei bestimmten speichergeschützten Betriebssystemen müssen Sie "Leck" definieren. Es ist sehr gut möglich, dass Anwendungen "System" -Ressourcen außerhalb ihres eigenen Speicherplatzes zuweisen (Handles werden häufig verwendet, um diese in der Windows-Welt zu identifizieren). Durch das Schließen Ihrer Anwendung wird nicht immer sichergestellt, dass diese Arten von Ressourcen freigegeben werden.
David
34

Das Betriebssystem, das Ihr Programm ausführt, führt normalerweise Bereinigungsspeicher durch, der nicht explizit freigegeben wird, und Handles, die nicht explizit geschlossen werden. Dies wird jedoch vom C ++ - Standard nicht garantiert. Möglicherweise finden Sie ein eingebettetes Gerät, das Ihre Speicherlecks nicht freisetzt.

Davon abgesehen machen Windows und alle Linux-Distributionen, die ich je gesehen habe, Speicherlecks frei.

Sie können jedoch leicht eine große Schleife von Speicherlecks erstellen, um sie selbst zu testen. Beobachten Sie, wie Ihre RAM-Auslastung zunimmt, und schließen Sie dann Ihr Programm. Sie werden sehen, dass die RAM-Auslastung wieder abnimmt.


Eine weitere Überlegung bei der Verwendung von C ++ ist, dass Ihre Destruktoren auch nicht aufgerufen werden, wenn Sie Ihren Heap-zugewiesenen Speicher nicht löschen. Manchmal haben Sie auch andere Nebenwirkungen, wenn Ihre Destruktoren nicht aufgerufen werden.

Brian R. Bondy
quelle
14

Laufen Sie auf einem Desktop-Betriebssystem (Windows, Linux usw.)? Wenn ja, ja, im Allgemeinen gibt das System beim Beenden des Programms den mit dem Programm verknüpften Speicher frei.

Vicky
quelle
10

Normalerweise ja. Einige Systeme unterstützen beispielsweise gemeinsam genutzte Speicherblöcke, die beim Beenden eines Programms nicht automatisch freigegeben werden. Die meisten behalten immer noch einen Referenzzähler bei und löschen ihn, wenn alle Programme, die ihn geöffnet haben, beendet werden, einige jedoch nicht (z. B. hatte 16-Bit-Windows einige Arten von Elementen, die auch dann zugewiesen bleiben, wenn nichts auf sie verweist - obwohl es stürzte normalerweise aus anderen Gründen ab, bevor sich genug davon ansammelte, um ein Problem zu verursachen ...)

Jerry Sarg
quelle
5

Soweit ich weiß, wird ein modernes Betriebssystem diesen Speicher freigeben, sobald das Programm beendet ist.

Ravibhagw
quelle
4

Hängt davon ab, welchen Speicher Sie verloren haben. Ein Teil des Speichers kann vom Betriebssystem nicht zurückgefordert werden. Der meiste Speicher auf den meisten Betriebssystemen wird jedoch automatisch zurückgefordert, wenn der Prozess beendet wird.

Hündchen
quelle
6
Ein Teil des Speichers kann vom Betriebssystem nicht zurückgefordert werden - wie zum Beispiel was?
2
Auf einigen Echtzeitbetriebssystemen habe ich spezielle Ethernet-Pufferblöcke gesehen, die beim Beenden eines Prozesses nicht bereinigt werden.
Brian Neal
1
Der gemeinsam genutzte Speicher wird normalerweise auch nicht zurückgefordert, da er möglicherweise für vorübergehende Prozesse beibehalten werden soll.
Brian Neal