free

La fonction free libère une zone mémoire créée péalablement par les fonctions malloc ou calloc. Elle permet de diminuer les risque d’être à court de mémoire. Elle admet l’adresse de cette zone mémoire en paramètre (aucun effet si le pointeur est nul).

Sa signature est la suivante :

void free (void *ptr) ;

Son utilisation est simple :

int *pentiers ; pentier = malloc(sizeof(int)) ;

free(pentier) ;

int * ptable = (int *) calloc(3, sizeof(int)) ;

free(ptable) ;

Attention, les pointeurs pentier et ptable ne sont pas modifiés ; ils gardent leur valeurs à l’issu de l’appel de free (ils ne sont pas mis à NULL, ce qui aurait été plus sûr).

Notez que l’on n’a pas besoin de passer la taille de la zone libérée ; le langage C est capable de se débrouiller sans.

Les dangers de la libération de mémoire

Offrir une fonction free dans un langage est toujours source de problèmes. Voici quelques erreurs possibles :

  • Continuer à accéder à un objet libéré (accès via le même pointeur ou un autre pointeur. La zone mémoire qu’il occupait a pu être réallouée.
  • Vouloir libérer 2 fois la même zone (2 appels consécutifs à free avec deux pointeurs ayant la même valeur). L’effet est imprévisble.
  • Appeler free avec un pointeur qui ne pointe pas sur une zone allouée par malloc ou calloc. On tente d’opérer hors du tas.

Pour éviter ces problèmes, certains langages (mais pas le C) fournissent une récupération automatique des zones de mémoire allouées et devenues inutiles (plus de pointeurs sur la zone). Ce mécanisme est appelé ramasse-miettes ou garbage collector. Mais ces langages limitent les opérations possibles sur les pointeurs (pas d’opération arithmétique, pas de d’affectation).

» Glossaire du langage C