Frage

Gibt es einen Punktspeicher in einer atexit () Funktion zu befreien?

Ich habe eine globale Variable, die nach dem Start malloc'ed werden. Ich konnte eine atexit () Funktion schreiben, es zu befreien, ist aber nicht das System geht all diese Speicher zurückzugewinnen, wenn das Programm beendet eigentlich?

Gibt es einen Nutzen für ordentlich zu sein und Reinigung aktiv auf mich?

War es hilfreich?

Lösung

Nicht in C - es ist wie die Liegestühle neu anordnen, während das Schiff Sie sinkt um

.

In C ++ ist die Antwort anders, weil Objekte temporäre Dateien löschen und so weiter in ihren Destruktoren, so dass Sie sicherstellen müssen, dass diejenigen aufgerufen.

Andere Tipps

Ein Vorteil auf Befreiung ist, dass, wenn Sie jemals einen Speicherverlust Tests durchführen, die Zuweisungen mit Zuordnungsaufhebungen über die gesamte Lebensdauer des Prozesses anzupassen versucht, Sie nicht falsch positive Ergebnisse aus dieser Art von vorsätzlichem Leck bekommen.

Sehen als malloc() / free() beinhalten normalerweise umfangreiche Datenstrukturen, die in User-Space existieren, free()ing Speicher, wenn Ihr Programm endet eigentlich eine Performance Drain sein kann. Wenn Teile der Datenstruktur auf der Festplatte ausgelagert werden, müssen sie von der Festplatte geladen werden, nur verworfen werden!

Während, wenn Sie ohne free()ing beenden, werden die Daten auf die Festplatte ausgelagert in Frieden sterben kann.

Natürlich free()ing zu anderen Zeiten ist in der Regel vorteilhaft, da weiterer malloc()s kann den Raum wieder verwenden Sie befreit und free() könnte sogar etwas Speicher unmap, die dann von anderen Prozessen verwendet werden können.

In allen modernen Betriebssystemen, können Sie davon ausgehen, dass alle Speicher, wenn das Programm beendet befreit werden.

Eigentlich ordentlich sein kann interessant sein, wenn Ihr Programm evolves.It zwingt Sie Bereinigungsfunktion zu schreiben, wenn Sie „Initialisierung“ Funktionen erstellen. Der Vorteil kommt, wenn Ihr Programm wird immer komplexer, und Sie mögen einen Teil des Programms neu zu starten. Wenn Sie bereits geschrieben haben Bereinigungsfunktionen arbeiten, ist es weniger wahrscheinlich, dass Sie plötzlich einige Bereinigungs vergessen, wenn ein Teil des Programms „Neustart“.

Das Schreiben Bereinigungsfunktion „träge“, dh nur dann, wenn Sie es brauchen ist fehleranfällig. Schreiben Bereinigungsfunktionen zwingt Sie Bereinigung und eventuelle Bereinigung Abhängigkeit zu denken. Es ermöglicht einfache Code-Wiederverwendung eines Teils des Codes in einem anderen Projekt.

Also ja befreiend in einem atexit ist nutzlos, und so Dateideskriptors schließt. Allerdings schreiben und Bereinigungsfunktion beibehalten wird, wie Ihr Code wächst kann eine Einschränkung sein, dass Sie darüber nachdenken, zwingen wird, was Sie tun

Sie sollten frei (), wenn Ihr Code, die atexit () ist Teil von dynamisch geladen gemeinsam genutzte Bibliothek (mit dlopen (), zum Beispiel) anruft. In diesem Fall wird der atexit Handler bei dlclose () Zeit so genannt, der Heap für den Rest des Prozesses besteht weiterhin zu verwenden.

Unter Windows zurückkehren einig Anrufe Speicher, der mit dem Betriebssystem oder zu COM gehört, und Sie müssen, dass der Speicher explizit freizugeben oder es wird nicht einmal nach dem Prozess beendet befreit werden. Aber das ist ein seltenes Szenario.

nicht befreien Speicher vor Beendigung des Prozesses ist nicht ein Speicherverlust. es ist ein Speicherverlust, wenn Sie einen Griff zu verlieren. aber Speicher ist nicht die einzige Art von Ressource und andere Ressourcen bleiben in Prozessen (wie Fenstergriffe und Datei-Handles), so dass Sie brauchen, um ‚freie‘ diejenigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top