Libérer la mémoire avec free()
Fait partie de la section Logic & Flow du Journey C de Coddy — leçon 35 sur 63.
Lorsque vous allouez de la mémoire dynamiquement en utilisant malloc(), cette mémoire reste allouée jusqu'à ce que vous la libériez explicitement. La fonction free() est votre outil pour restituer la mémoire allouée dynamiquement au système lorsque vous avez fini de l'utiliser.
La fonction free() prend un argument : un pointeur vers le bloc de mémoire que vous souhaitez libérer. Cela doit être le même pointeur que celui retourné par malloc() (ou des fonctions apparentées comme calloc()).
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Allouer de la mémoire
*ptr = 42; // Utiliser la mémoire
free(ptr); // Libérer la mémoire une fois terminéNe pas appeler free() crée ce que l'on appelle une fuite de mémoire. La mémoire allouée reste réservée par votre programme même si vous ne l'utilisez plus. Dans les programmes à exécution longue ou les programmes qui allouent de la mémoire de manière répétée, ces fuites peuvent consommer toute la mémoire système disponible et provoquer des problèmes de performance ou des plantages.
N'oubliez pas : chaque malloc() doit avoir un free() correspondant. Ce couplage est essentiel pour une gestion responsable de la mémoire en programmation C.
Défi
FacileÉcrivez un programme en C qui démontre le cycle de vie complet de l'allocation et de la désallocation dynamique de mémoire. Votre programme doit :
- Lire un entier
countde l'utilisateur représentant le nombre d'entiers à stocker - Utiliser
malloc()avecsizeof()pour allouer dynamiquement de la mémoire pour un tableau decountentiers - Vérifier si l'allocation de mémoire a réussi - si elle échoue, afficher
Memory allocation failed!et terminer le programme - Si l'allocation réussit, afficher
Memory allocated successfully! - Lire
countvaleurs entières de l'utilisateur et les stocker dans le tableau alloué - Calculer et afficher la somme de toutes les valeurs au format :
Sum: [value] - Trouver et afficher la valeur maximale au format :
Maximum: [value] - Utiliser
free()pour désallouer la mémoire - Afficher
Memory freed successfully!pour confirmer le nettoyage
N'oubliez pas d'inclure l'en-tête <stdlib.h> pour utiliser malloc() et free(). Ce défi démontre l'association essentielle de malloc() et free() pour prévenir les fuites de mémoire dans vos programmes.
Par exemple, si l'entrée est :
4
15 8 23 12Votre sortie devrait être :
Memory allocated successfully!
Sum: 58
Maximum: 23
Memory freed successfully!Ce défi renforce le concept critique selon lequel chaque bloc de mémoire alloué dynamiquement doit être correctement libéré lorsqu'il n'est plus nécessaire, complétant ainsi le cycle de gestion responsable de la mémoire en programmation C.
Aide-mémoire
Utilisez free() pour libérer la mémoire qui a été allouée avec malloc() :
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Allouer de la mémoire
*ptr = 42; // Utiliser la mémoire
free(ptr); // Libérer la mémoire une fois terminéChaque malloc() doit avoir un free() correspondant pour éviter les fuites de mémoire. Le pointeur passé à free() doit être le même pointeur que celui retourné par malloc().
Essayez vous-même
#include <stdio.h>
#include <stdlib.h>
int main() {
int count;
// Lire le nombre d'entiers à stocker
scanf("%d", &count);
// À FAIRE : Écrivez votre code ci-dessous
// 1. Allouer de la mémoire en utilisant malloc() avec sizeof()
// 2. Vérifier si l'allocation a réussi
// 3. Lire les valeurs entières et les stocker
// 4. Calculer la somme et trouver le maximum
// 5. Libérer la mémoire allouée
return 0;
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logic & Flow
1Les bases des pointeurs
Qu'est-ce qu'un pointeur ?Déclaration de pointeursL'opérateur d'adresse (&)L'opérateur de déréférencement (*)Pointeurs NULLRécapitulatif : Les bases des pointeurs4Projet : Utilitaire de texte simple
Présentation du projetCompter les caractères2Pointeurs et Tableaux
Noms de tableaux comme pointeursÉléments de tableau - PointeursArithmétique des pointeursComparaison de pointeursRécapitulatif : Parcours de tableau par pointeur5Pointeurs et fonctions
Passage par valeurPassage de pointeurs aux fonctionsModifier des variables via des pointeursUn exemple classique : SwapPassage de tableaux aux fonctionsRécapitulatif : Pointeurs comme arguments de fonction3Tableaux de caractères et chaînes
Les chaînes comme tableaux de charLe terminateur nulSaisie de chaînes avec scanfUtilisation de strlen()Utilisation de strcpy()Utilisation de strcat()Utilisation de strcmp()Récapitulatif : Fonctions de base sur les chaînes6Gestion de la mémoire
Mémoire Pile vs TasAllocation dynamique - malloc()Utiliser sizeof() pour l'allocationVérifier l'échec de l'allocationLibérer la mémoire avec free()Allouer avec calloc()Récapitulatif : Tableaux dynamiques