Fonctions de la bibliothèque C -free()
Bibliothèque standard C - <stdlib.h>
Description
Dans le langage C,free()La fonction est une fonction de bibliothèque standard, utilisée pour libérer la mémoire allouée parmalloc(), calloc(), realloc()mémoire allouée par des fonctions d'allocation dynamique telles que. Lorsque la mémoire allouée dynamiquement n'est plus nécessaire, appelerfree()la fonction peut éviter les fuites de mémoire et garantir que le programme gère efficacement la mémoire.
Déclaration
Voici la déclaration de la fonction free().
void free(void *ptr)
Paramètre
- ptr-- Le pointeur pointe vers un bloc de mémoire à libérer, qui a été précédemment alloué en appelant malloc, calloc ou realloc. Si l'argument passé est un pointeur nul, aucune action n'est effectuée.
Valeur de retour
Cette fonction ne renvoie aucune valeur.
Exemple
L'exemple suivant illustre l'utilisation de la fonction free().
Exemple
Compilons et exécutons le programme ci-dessus, ce qui produira le résultat suivant :
String = example, Address = 0x7fe4e4c02b10 String = example.com, Address = 0x7fe4e4c02b10
Notes
Libérer la bonne mémoire: Seule la mémoire allouée via des fonctions d'allocation dynamique de mémoire peut être libérée ; la mémoire allouée par d'autres moyens (par exemple, des variables locales ou des variables globales) ne peut pas être libérée.
Éviter la double libération: Le même bloc de mémoire ne peut pas être libéré plusieurs fois ; sinon, un comportement indéfini peut se produire.
Gestion des pointeurs après libération: Après que la mémoire est libérée, le pointeur pointe toujours vers l'emplacement mémoire libéré. Pour éviter un pointeur suspendu, vous pouvez définir le pointeur sur
NULL。free(array); array = NULL;
Vérification du pointeur NULL: appeler
free()Avant [de libérer], il est préférable de vérifier si le pointeur est NULL afin d'assurer la stabilité du programme.if (array != NULL) { free(array); array = NULL; }
En utilisant correctement la fonction free(), la mémoire allouée dynamiquement peut être gérée correctement, en évitant les fuites de mémoire et les problèmes de pointeur suspendu, et en améliorant la stabilité et la fiabilité du programme.
Fuites de mémoire et pointeurs suspendus
- Fuite de mémoire: Si la mémoire allouée dynamiquement n'est pas libérée ou si sa référence est perdue, la mémoire ne peut plus être utilisée par le programme, ce qui entraîne une fuite de mémoire.
- Pointeur suspendu: Un pointeur qui pointe vers une mémoire libérée est appelé pointeur suspendu. Si un pointeur suspendu est à nouveau accédé, cela conduit à un comportement indéfini, ce qui peut provoquer des plantages du programme ou une corruption des données.
En C, après avoir appelé free() pour libérer la mémoire allouée dynamiquement, le pointeur contient toujours l'adresse précédemment allouée, ce qui conduit à un pointeur suspendu. Un pointeur suspendu est un pointeur qui pointe vers une mémoire libérée. Le déréférencer conduit à un comportement indéfini.
Pour éviter le problème du pointeur suspendu, la pratique habituelle consiste à définir le pointeur sur NULL après avoir appelé free(). Cela garantit que le programme n'utilise pas par erreur de la mémoire libérée.
Exemple
#include <stdlib.h>
int main() {
// allouer dynamiquement de la mémoire
char *str = (char *)malloc(100 * sizeof(char));
if (str == NULL) {
printf("Échec de l'allocation mémoire\n");
return 1;
}
// Utiliser la mémoire allouée
snprintf(str, 100, "Hello, World!");
printf("%s\n", str);
// Libérer la mémoire allouée dynamiquement
free(str);
// définir le pointeur sur NULL pour éviter un pointeur suspendu
str = NULL;
// maintenant str est NULL, évitant en toute sécurité le problème de pointeur suspendu
if (str == NULL) {
printf("str is NULL\n");
}
return 0;
}
Dans cet exemple, le pointeur str est défini sur NULL après l'appel à free(), évitant ainsi le problème de pointeur suspendu. Si vous tentez d'utiliser à nouveau ce pointeur, puisqu'il est NULL, vous pouvez éviter un comportement indéfini grâce à une vérification conditionnelle.
autres extensions