free(3)
Fonction de la bibliothèque C
Rend au tas un bloc obtenu par malloc, calloc ou realloc. free(NULL) est sûr, libérer deux fois ou un pointeur non alloué est un comportement indéfini.
#include <stdlib.h>
void free(void *ptr);Description
free rend un bloc du tas pour qu'il puisse resservir. Son argument doit être une adresse renvoyée par malloc(3), calloc(3) ou realloc(3), exactement telle qu'elle a été renvoyée. Pas un pointeur vers le milieu du bloc, pas une variable de pile, pas une chaîne littérale.
Un seul cas est totalement sûr : free(NULL) ne fait rien. C'est garanti par la norme, et ça évite une tonne de if (p != NULL) avant chaque libération. Tout le reste est à toi de surveiller. Libérer deux fois le même bloc, ou passer un pointeur qui ne vient pas du tas, est un comportement indéfini. Avec la glibc (Linux courant), ça se traduit par un message comme free(): double free detected in tcache 2 ou free(): invalid pointer suivi de Aborted ; avec musl (Alpine, l'environnement des exercices Grademe), par un simple segmentation fault. Les deux cas sont détaillés dans double free detected.
Valeur de retour
Aucune, free renvoie void. Après l'appel, le pointeur que tu as passé ne désigne plus rien de valide : le relire ou le relibérer est un comportement indéfini. Le réflexe utile est free(p); p = NULL;, puisqu'un free(NULL) ultérieur ne fera rien.
Exemple
#include <stdio.h>#include <stdlib.h>
int main(void){ char *nom = NULL;
free(nom); /* sans effet, et c'est garanti */ nom = malloc(8); if (nom == NULL) return 1; free(nom); nom = NULL; /* plus de pointeur pendant */ return 0;}Pièges
Double
free: libérer deux fois le même bloc. Mets le pointeur àNULLaprès le premier appel.Libérer un pointeur décalé (
free(p + 1), unpqu'on a incrémenté dans une boucle) : garde le pointeur d'origine pour le rendre.freesur une variable de pile ou une chaîne littérale : ces adresses ne viennent pas du tas.Utiliser le bloc après
free(use after free) : la zone est recyclée, son contenu ne t'appartient plus.
free_str_array
Écris free_str_array, qui libère chaque chaîne d'un tableau terminé par NULL avant le tableau lui-même, et renvoie le nombre de chaînes libérées.