#include <stdlib.h> // <cstdlib> en C++
void free( void * pointer );
La fonction free
libère un bloc de mémoire alloué dynamiquement dans le tas (le heap, en anglais), via un appel à la fonction
malloc
(ou tout autre fonction d'allocation mémoire : aligned_alloc
,
calloc
ou realloc
).
Note : ne jamais désallouer avec la fonction free
un bloc de mémoire obtenu autrement que par l'une des
quatre fonctions présentées ci-dessus.
Aucune valeur de retour n'est produite.
#include <assert.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { /* Cherchons à dupliquer une chaîne de caractères en mémoire */ char * original = "Chaine originale"; char * copy = NULL; /* Calcul de la taille à allouer */ size_t l = strlen( original ) + 1; /* Allocation de la mémoire */ copy = (char *) malloc( l * sizeof(char) ); assert( copy != NULL ); /* On duplique la chaine originale */ strcpy( copy, original ); /* On test que ca marche */ printf( "La copie contient : %s\n", copy ); /* Toujours libérer la mémoire après utilisation */ free( copy ); return 0; }
Astuce : utilisez un profileur de code C pour vérifier que la mémoire est bien libérée. Si vous êtes sur plate-forme Linux,
le mieux est d'utiliser l'outil Valgrind (installez le si nécessaire :
http://www.valgrind.org). L'exemple ci-dessous vous montre ce qui est
produit par Valgrind sur l'exemple ci-dessus. Testez aussi votre programme en commentant l'appel à free
.
$> valgrind testFree ==7223== Memcheck, a memory error detector ==7223== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. ==7223== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info ==7223== Command: a.out ==7223== La copie contient : Chaine originale ==7223== ==7223== HEAP SUMMARY: ==7223== in use at exit: 0 bytes in 0 blocks ==7223== total heap usage: 1 allocs, 1 frees, 17 bytes allocated ==7223== ==7223== All heap blocks were freed -- no leaks are possible ==7223== ==7223== For counts of detected and suppressed errors, rerun with: -v ==7223== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2) $>
Dans le cas où vous observeriez une fuite mémoire, relancez Valgrind avec l'option suivante :
valgrind --leak-check=full testFree
.
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :