FREE |
Libère |
---|---|
Langage C++ | cstdlib (stdlib.h) |
Syntaxe
void free(void *pointeurbloc) |
Paramètres
Nom | Description |
---|---|
pointeurbloc | Ce paramètre permet d'indiquer un pointeur sur le bloc de mémoire à libérer |
Description
Cette fonction permet de libérer un bloc de mémoire.
Remarques
- La fonction free() renvoie la mémoire pointée par pointeurbloc à la mémoire de tas. Cette situation rend la mémoire disponible pour une allocation future.
- Il est impératif que free() soit uniquement appelé avec un pointeur ayant été précédemment alloué en utilisant l'une des fonctions du système d'allocation dynamique (malloc() ou calloc()). L'utilisation d'un pointeur non valide dans l'appel détruira probablement le mécanisme de gestion de la mémoire et provoquera un plantage du système.
- Libération de la mémoire allouée avec malloc, calloc et realloc : La fonction free est utilisée pour libérer la mémoire allouée dynamiquement avec malloc, calloc ou realloc. Elle ne doit pas être utilisée sur des objets alloués avec new, sous peine d'un comportement indéfini. Pour ces derniers, il faut utiliser delete ou delete[].
- Effet sur le pointeur passé en paramètre : Après un appel à free(ptr), la mémoire est libérée, mais le pointeur pointeurbloc lui-même conserve son adresse. Il devient un "dangling pointer", c'est-à-dire un pointeur ne pointant plus vers une mémoire valide. Tenter d'accéder aux données via ce pointeur après free entraîne un comportement indéfini.
- Ne pas libérer une mémoire non allouée dynamiquement : Il est interdit d'appeler free sur un pointeur ne provenant pas de malloc, calloc ou realloc. Libérer un pointeur alloué sur la pile (comme une variable locale) ou une constante entraîne des erreurs et peut provoquer un crash du programme.
- Sécurité : éviter le double free Libérer deux fois la même zone mémoire est une erreur classique connue sous le nom de "double free". Cela peut corrompre de la mémoire de tas (heap corruption) et provoquer des comportements imprévisibles. Exemple :
- Ne fait pas nécessairement de la remise à zéro : free libère la mémoire, mais ne l'efface pas physiquement. Les données peuvent encore être présentes jusqu'à ce qu'elles soient écrasées par une nouvelle allocation. Pour effacer les données avant de libérer la mémoire, il faut les écraser manuellement avec memset avant d'appeler free.
- Libération conditionnelle avec NULL : Il est sécuritaire d'appeler free(NULL), ce qui est une caractéristique importante. Lorsqu'un pointeur est NULL, free(NULL) n'a aucun effet et ne provoque pas d'erreur. Cela permet d'écrire un code plus robuste en évitant de vérifier systématiquement si le pointeur est NULL avant l'appel à free.
- Alternative en C++ : préférer delete et delete[] : En C++, free n'est pas recommandé car elle ne gère pas l'appel aux destructeurs des objets alloués dynamiquement. Il est préférable d'utiliser delete pour les allocations avec new et delete[] pour new[], afin d'assurer une bonne gestion des ressources et éviter des fuites mémoire.
Une bonne pratique est de toujours affecter NULL au pointeur après free, ce qui permet d'éviter un double free accidentel.
Exemple
Voici quelques exemples typiques de l'utilisation de cette fonction :

- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
-
- int main()
- {
- long * tableau1, * tableau2;
- tableau1 = (long *) malloc(1000*sizeof(long));
- tableau2 = (long *) calloc(1000,sizeof(long));
- if(tableau1 != NULL) {
- std::cout << "Libère le tableau1" << std::endl;
- free(tableau1);
- }
- if(tableau2 != NULL) {
- std::cout << "Libère le tableau2" << std::endl;
- free(tableau2);
- }
- return 0;
- }
on obtiendra le résultat suivant s'il y a assez de mémoire disponible :
Libère le tableau1Libère le tableau2
Voir également
Langage de programmation - C++ - Référence de procédures et fonctions - calloc
Langage de programmation - C++ - Référence de procédures et fonctions - malloc
Langage de programmation - C++ - Référence de procédures et fonctions - realloc
Langage de programmation - C - Référence de procédures et fonctions - free
Références
Langage C, Edition Micro-Application, Gehard Willms, 2001, ISBN: 2-7429-2008-0, page 731.
Borland C++ for Windows 4.0, Library Reference, Edition Borland, 1993, Part # BCP1240WW21772, page 111.