2009-06-14 15 views
5

Mögliche Duplizieren:
What REALLY happens when you don’t free after malloc?Wichtigkeit der Freigabe von Speicher?

Wenn ein Programm in C/C++ endet, müssen Sie durch die Befreiung Zeiger aufzuräumen. Was passiert, wenn Sie den Speicher nicht freigeben, wie wenn Sie einen Zeiger auf einen int haben und ihn nicht löschen, wenn Sie das Programm beenden? Wird der Speicher noch verwendet und kann nur durch den Neustart freigegeben werden, oder wird er automatisch freigegeben, wenn das Programm beendet wird? Und im letzten Fall, warum frei, wenn das Betriebssystem es für Sie tut?

+1

Duplizieren: http://stackoverflow.com/questions/654754/what-really-happens-when-you-dont-free-after-malloc –

+1

Duplizieren Sie das auch: http://stackoverflow.com/questions/ 347338/is-object-release-on-programm-exit-really-needed/347349 – Tom

Antwort

5

Wenn Ihr Programm endet, wird der gesamte Speicher vom Betriebssystem freigegeben.

Der Grund, warum Sie es selbst befreien sollten ist, dass Speicher eine endliche Ressource innerhalb Ihres laufenden Programms ist. Sicher in sehr kurzen laufenden einfachen Programmen, fehlender Speicher wird keine spürbare Wirkung haben. Bei lang laufenden Programmen bedeutet es jedoch, dass Sie keine endliche Ressource verbrauchen, ohne sie wieder freizugeben. Irgendwann wird es ausgehen und dein Programm wird grob zum Absturz bringen. Deshalb müssen Sie Speicher freigeben.

+1

Sehr gut gemacht. Die Wichtigkeit, ungenutzten Speicher freizugeben (und natürlich so zu implementieren, dass Sie unnötige Speicherzuweisungen freigeben können), ist in lang laufenden Programmen entscheidend. Wenn Sie eine kurze kurze Hausaufgabe schreiben, ist die Bedeutung von akademischem Interesse. Allerdings, wenn Sie eine große Anwendung schreiben (wie Firefox - ich kenne die Argumente, keine Flammen bitte) und Sie immer neue Speicherblöcke reservieren und alte ungenutzte nicht freigeben, haben Sie entweder nicht genügend Arbeitsspeicher oder Ihre Anwendung wird wegen zu viel Ressourcenzuweisung abgeworfen werden. – nik

7

Wenn das Programm beendet wird, wird der gesamte Speicher (freigegeben oder nicht) vom Betriebssystem zurückgewonnen. Es ist jedoch immer noch eine gute Methode, alles freizugeben, was Sie zugeteilt haben - hauptsächlich, um es gewohnt zu sein, oder falls Sie Ihr Programm so erweitern, dass es nicht mehr dort endet, wo es früher war.

+1

Das stimmt. Damit Ihr Programm skalierbar ist, sollten Sie alles so früh wie möglich freigeben.Dies ist gelegentlich am Ende des Programms, aber normalerweise nicht. –

5

Auf einem Desktop-Betriebssystem wie Windows, Linux oder MacOS wird Ihr Speicher für Sie aufgeräumt.

Auf einigen Echtzeit- oder Embedded-Betriebssystemen wird es nicht für Sie bereinigt.

Aber es ist eine gute Idee, immer Speicher freizugeben, wenn Sie damit fertig sind - bedenken Sie, dass während der Ausführung Ihres Programms all dieser Speicher noch verwendet wird. Wenn Sie es nicht freigeben, erhöht sich die Speichernutzung des Geräts.

Sie müssen auch beim Refactoring vorsichtig sein - sagen Sie, Sie beginnen mit dem Schreiben einer main() Funktion, die etwas Speicher reserviert, und Sie kümmern sich nicht darum, es zu befreien, weil das OS es für Sie tun wird. Aber dann verschiebst du diesen Code in eine Funktion, die über einen langen Zeitraum oft aufgerufen wird - plötzlich hast du ein großes Speicherleck.

1

Der Speicher wird durch das Betriebssystem bei Programmbeendigung freigegeben, aber wenn alles, was Sie haben, ein kleiner Speicherverlust ist, ist das die geringste Ihrer Sorgen.

Problematisch ist: 1) Wenn es in einer Schleife passiert, wird Ihr Programm in der Größe und 2) in C++, wenn Ihre "new" ed-Objekte nicht "löschen" sind, werden Ihre Destruktoren nicht ausgeführt , und dies kann zu viel ernsthafteren Problemen führen (Mutex undicht, oder Lecks Ressourcen NICHT vom Betriebssystem bereinigt, Datenintegritätsprobleme, die Liste geht weiter)

0

Es ist wichtig, Speicher ordnungsgemäß zu befreien, so dass Tools, die helfen Sie werden feststellen, dass Speicherlecks eine sinnvolle Ausgabe haben, wenn und wenn Sie Probleme aufspüren müssen. Indem Sie zulassen, dass das Betriebssystem den Speicher für Sie freigibt, fügen Sie zusätzlichen Analysefunktionen hinzu, die Sie später verwenden können. Selbst wenn das Betriebssystem den Speicher an das System zurückgibt, sollten Sie ein solides Design haben, das den Speicher ordnungsgemäß verwendet und Ihnen die bestmögliche Verwendung von Tools ermöglicht.

Verwandte Themen