Also habe ich dieses Programm, das 256 MB Speicher zuweist, und nachdem der Benutzer die EINGABETASTE drückt, wird der Speicher freigegeben und beendet.Warum verbraucht malloc nicht den Speicher auf meinem Computer?
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *p, s[2];
p = malloc(256 * 1024 * 1024);
if (p == NULL)
exit(1);
printf("Allocated");
fgets(s, 2, stdin);
free(p);
return 0;
}
Ich lief dieses Programm mehrmals und backgrounded jeder von ihnen, bis es nicht mehr genügend Speicher, der zugeordnet werden kann. Das passiert jedoch nie. Ich habe einen Linux-Befehl top
ausgeführt und selbst nach dem Ausführen dieses Programms viele Male, der freie Speicher geht nie um fast so viel wie 256 MB.
jedoch auf der anderen Seite, wenn ich calloc
statt malloc
verwenden, dann gibt es einen großen Unterschied:
p = calloc(256 * 1024 * 1024, 1);
Nun, wenn ich das Programm und Hintergrund es laufen, und wiederholen, jedes Mal wenn ich Führen Sie es aus, der freie Speicher wird um 256 MB reduziert. Warum ist das? Warum bewirkt malloc
keine Änderung des verfügbaren freien Speichers, aber calloc
?
Führen Sie das Programm über strace, und sehen, was es tut. (Ich würde erwarten, _both_ Versionen zu anonym/anonymousmap/dev/0, BTW) – wildplasser
Es heißt "Lazy allocation". http: // Stapelüberlauf.com/questions/712683/what-is-lazy-allocation – jaeheung
Die kurze, vereinfachende Antwort ist, dass, da Sie den Speicher von 'malloc' noch nicht benutzt haben, der Computer ihn Ihnen noch nicht wirklich geben muss. Mit 'calloc' muss jedoch der Speicher verwendet werden (für den Nullstellungsteil), und deshalb muss der Computer tatsächlich alles davon geben. –