Wenn ich - ohne es zu wissen - einen Speicherverlust programmiert habe und die Anwendung beendet wird, wird der durchgesickerte Speicher freigegeben?
Wenn ich - ohne es zu wissen - einen Speicherverlust programmiert habe und die Anwendung beendet wird, wird der durchgesickerte Speicher freigegeben?
Antworten:
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.
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.
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 ...)
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.