2010-11-25 8 views
4

Ich schreibe eine C-App und ich verwende malloc, um Daten auf dem Heap zu erstellen. Jetzt, während die Anwendung aktiv ist, sind diese Daten immer persistent, so dass ich die Malloc-Daten niemals "freigebe".Ressourcenverbrauch von MALLOC in einer C-Anwendung

Meine Frage ist: Wird dieser Speicher automatisch freigegeben, wenn die Anwendung beendet wird, oder muss ich free() manuell nach Abschluss meiner Anwendung ausführen?

Antwort

5

Dies ist implementierungsdefiniert. Streng nach dem C-Standard sollten Sie free alles, was Sie malloc haben, bevor die Anwendung beendet wird.

Jedes moderne Allzweck-Betriebssystem wird jedoch nach Ihnen aufräumen, so dass dies nur in einigen eingebetteten, altmodischen oder sonst exotischen Umgebungen relevant ist.

Als ein Punkt der Art, versuchen Sie zu free jeden zugewiesenen Block. Sie haben die Angewohnheit, sauberen Code zu schreiben und Speicherlecks zu verhindern.

+0

Ich kann keine Aussage oder Implikation in der Norm finden, dass Sie alles, was Sie malloc "befreien" sollten. Natürlich liegen die gehostete Umgebung und die Art der Prozesse außerhalb des Geltungsbereiches der C-Spezifikation, aber ich kann mir kein Betriebssystem mit dem Gefühl vorstellen, ein Programm auszuführen, bei dem der Programmspeicher beim Beenden nicht dem Betriebssystem überlassen wird DOS. Sicherlich haben eingebettete Umgebungen ohne ein Betriebssystem möglicherweise nicht einmal eine Vorstellung davon, "das Programm auszuführen" oder "zu beenden", in welchem ​​Fall die Angelegenheit irrelevant ist. –

+0

@R ..: Ich habe keine Kopie des Standards bereit, aber ich erinnere mich, dass es nicht angibt, was passiert mit Malloc'd Speicher beim Beenden. Ich habe gehört (keine Referenz, also könnte das nur ein Gerücht sein), dass einige ältere Mainframe-Betriebssysteme explizit "frei" benötigen, da sie pro Benutzer einen einzigen Adressraum haben. –

2

Es wird freigegeben. Das sind die Wunder der "Prozess" -Abstraktion. Alle Ressourcen und Speicher, die diesem laufenden Prozess gehören, werden bei Beendigung freigegeben.

Beachten Sie, dass es einige Zeit gedauert hat, um mit dieser Abstraktion zu kommen, aber es ist eine wirklich schöne Sandbox für ein System. In der Tat werden Tötungs-Prozesse sogar als letzter Ausweg genutzt, um Buggy-Programme zu reparieren, die während Tagen Lecks oder Leistungseinbußen aufweisen (sie wird mit dem hübschen Namen "Process Rejuvenation" aufgerufen und ist sogar in Konferenzen und Journalen vorhanden, ist es aber) wirklich ein Zutritt zu einem schlechten Design oder Kodierung).

+2

Es hängt immer noch irgendwie vom Betriebssystem ab, aber ja, die meisten Betriebssysteme werden den Speicher freigeben. –

+0

@Let_Me_Be: zumindest diejenigen mit der "Prozess" -Abstraktion :) –

+0

@Let_Me_Be: Könnten Sie ein Betriebssystem erwähnen, das nach der Prozessbeendigung nicht aufräumt? – Cratylus

-2

Sie sollten nie explizit free solchen Speicher. Im besten Fall wird es keinen Nutzen bringen, und im schlimmsten Fall wird es eine große Menge ausgelagerter Daten in den Speicher zurückverlagern, nur um einige Buchhaltungszeiger zu prüfen und dann zu verwerfen, wobei die Festplatte des Benutzers zwecklos verprügelt wird.

+1

-1 für die Empfehlung gegen eine der bekanntesten Praktiken in den meisten Nicht-OOP-Sprachen: "Immer frei, was Sie zuweisen". Einer der Vorteile besteht darin, dass Sie den Code eigenständig halten können. Wenn Sie also einen Code (Bibliotheksroutine?) In einer anderen App verwenden und die zugewiesenen Blöcke nicht mehr bestehen, bis die App beendet wird, sind Sie das auch in der Lage, den Code ohne Probleme wiederzuverwenden. Sonst fällt es dir vielleicht schwer zu finden, welche Sachen wann frei sein müssen. – TheBlastOne

+0

Sie können alle -1s geben, die Sie wollen, aber mein Rat wird ein Programm geben, das sich besser verhält. –

+3

Ich stimme eher mit R überein, obwohl es "übertrieben" zu sein scheint. Wenn Ihr Code ein Bibliothekscode ist, sollte er Bereinigungsfunktionen bereitstellen, die verwendete Ressourcen freigeben - ob sie aufgerufen werden oder nicht, hängt dann von der Anwendung ab. Es ist sicherlich richtig, dass beim Prozessende große Datenstrukturen nur zu "free()" iteriert werden (was oft nicht einmal den Speicher an das OS zurückgibt!).) kann eine zeitaufwändige Arbeit sein. – caf