Pourquoi free () ne libère pas vraiment la mémoire?

Je fais des tests d’allocation et de désallocation de mémoire. C’est le code que j’utilise:

#include  #include  #define WAVE_SIZE 100000000 int main(int argc,char* argv[]){ int i; int **p; printf("%d allocs...\n",WAVE_SIZE); // Malloc printf("Allocating memory...\n"); p = (int**)malloc(WAVE_SIZE*sizeof(int*)); for(i = 0;i < WAVE_SIZE;i++) p[i] = (int*)malloc(sizeof(int)); // Break printf("Press a key to continue...\n"); scanf("%*s"); // Dealloc printf("Deallocating memory...\n"); for(i = 0;i < WAVE_SIZE;i++) free(p[i]); free(p); // Break printf("Press a key to continue...\n"); scanf("%*s"); return 0; } 

Pendant les pauses, je vérifie la mémoire totale utilisée par le processus et je ne vois pas ce à quoi je m’attendais.

Jusqu’à la première pause, la consommation de mémoire augmente. Cependant, à la deuxième pause, je ne le vois pas être publié.

Est-ce un problème avec l’OS? Que se passe-t-il si la charge de ma machine est élevée, je n’ai pas de mémoire libre et un autre processus tente de l’allouer?

free ne free pas nécessairement la mémoire dans le système d’exploitation. Le plus souvent, il suffit de remettre cette zone de mémoire dans une liste de blocs libres. Ces blocs gratuits pourraient être réutilisés pour les prochains appels à malloc .

Lorsque la mémoire est allouée et plus tard libérée, cette mémoire rest toujours dans le processus, mais elle est marquée comme étant libre pour pouvoir être à nouveau allouée. En effet, sinon, le système d’exploitation doit modifier le mappage de la mémoire virtuelle du processus chaque fois que vous appelez malloc ou free , ce qui prend du temps.

Le moment où la mémoire système sera réellement libérée dépend du système d’exploitation.

Par exemple sous Windows, même si vous fermez un programme, la mémoire n’est pas libérée en même temps. Il est fait pour pouvoir le réutiliser au prochain démarrage du programme.

free() indique simplement à l’allocateur que votre programme n’a plus besoin de ce bloc . L’allocateur peut le mettre en cache pour une allocation ultérieure ou le renvoyer au système en modifiant le pointeur brk . Tout dépend de la mise en œuvre.