Ich habe ein Problem mit free () auf einer Struktur in meinem C-Programm. Wenn ich / proc // statm vor und nach dem freien schaue, scheint es nicht zu reduzieren. Benutze ich free () in diesem Fall falsch, oder lese ich / proc // statm falsch?
Hier ist ein Testfall, der das Problem ergibt:
%Vor%Die Ausgabe ist:
%Vor%Wenn ich es erwarten würde:
%Vor%Ich habe einen ähnlichen Test gemacht mit malloc'ing a (char *), dann frei 'es und es funktioniert gut. Gibt es etwas Besonderes an Strukturen?
Ihre Antwort ist direkt hier auf Stack Overflow , aber Die kurze Version besteht darin, dass der Speicherzuordner aus guten Gründen keinen Speicher an das Host-Betriebssystem zurückgibt, sondern ihn (intern im Datenbereich Ihres Programms) als eine Art freie Liste speichert.
Einige der Gründe, warum die Bibliothek den Speicher beibehält, sind:
Immer wenn free
den Speicher tatsächlich freigibt, ist die Implementierung abhängig. Vielleicht gibt free
den Speicher nicht sofort zurück, wenn es sich um einen großen Speicherblock handelt. Ich denke nicht, dass es etwas mit struct
s zu tun hat.
Hauptsächlich aus Gründen der Leistung wird der zugewiesene Heapspeicher nach der Freigabe nicht an das Betriebssystem zurückgegeben. Es wird jedoch als frei markiert, und vielleicht wird der Kernel es später zurückbekommen, oder Ihr Programm wird es zuweisen und es erneut verwenden.
Ich weiß nicht, was Sie verwendet haben, um (char *) zuzuweisen / freizugeben. Der Unterschied, den Sie gesehen haben, könnte sein, dass Ihr (char *) auf dem Stack zugewiesen wurde und der Release / Free-Prozess anders ist als mit dem Heap (Stack-Speicherverwaltung ist viel einfacher).
Es ist Sache des Betriebssystems, Ihre Daten wirklich freizugeben und damit den Speicherverbrauch Ihres Programms zu verringern. Sie sagen nur, dass Sie diesen Speicher nicht mehr benutzen werden.
Tags und Links c memory-management free struct malloc