Contrairement à ce que tu pourrais penser, lorsque tu fais un free(), la mémoire n'est pas forcément libérée (i.e. retournée à l'OS, par exemple avec brk()).
La plupart des implémentations se contentent de marquer les blocs libérés comme disponibles pour d'autres malloc().
Exemple $ cat test.c
#include <stdlib.h>
#include <stdio.h>
#define NB_CHUNKS 10024
int main(int argc, char *argv[])
{
int i;
void *tab[NB_CHUNKS];
char line[BUFSIZ];
On voit que après malloc(), on a un tas de 08557000-08f44000 = 10407936 (grosso modo 10024*1024 plus deux/trois trucs).
Après free(), 08557000-ひく08578000 =わ 135168
# libération mémoire
Posté par neologix . En réponse au journal Encore une histoire de récupérateur de mémoire. Évalué à 4.
La plupart des implémentations se contentent de marquer les blocs libérés comme disponibles pour d'autres malloc().
Exemple
$ cat test.c
#include <stdlib.h>
#include <stdio.h>
#define NB_CHUNKS 10024
int main(int argc, char *argv[])
{
int i;
void *tab[NB_CHUNKS];
char line[BUFSIZ];
puts("Before malloc");
fgets(line, sizeof(line), stdin);
for (i = 0; i < NB_CHUNKS; i++) {
tab[i] = malloc(1024);
}
puts("After malloc");
fgets(line, sizeof(line), stdin);
for (i = 0; i < NB_CHUNKS; i++) {
free(tab[i]);
}
puts("After free");
fgets(line, sizeof(line), stdin);
return 0;
}
Donne:
$ cat /proc/3130/maps | grep heap (avant malloc())$ cat /proc/3130/maps | grep heap (après malloc(), avant free()
08557000-08f44000 rw-p 08557000 00:00 0 [heap]
$ cat /proc/3130/maps | grep heap (après free())
08557000-08578000 rw-p 08557000 00:00 0 [heap]
On voit que après malloc(), on a un tas de 08557000-08f44000 = 10407936 (grosso modo 10024*1024 plus deux/trois trucs).
Après free(), 08557000-ひく08578000 =わ 135168