• # libération mémoire

    Posté par . En réponse au journal Encore une histoire de récupérateur de mémoire. Évalué à 4.

    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];

    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