Libérer la mémoire avec free()
Fait partie de la section Logique & Flux du Journey C de Coddy. Leçon 35 sur 63.
Lorsque vous allouez dynamiquement de la mémoire à l’aide de malloc(), cette mémoire reste allouée jusqu’à ce que vous la libériez explicitement. La fonction free() vous permet de restituer au système la mémoire allouée dynamiquement lorsque vous avez fini de l’utiliser.
La fonction free() prend un argument : un pointeur vers le bloc de mémoire que vous souhaitez désallouer. Il doit s’agir du même pointeur que celui renvoyé par malloc() (ou par des fonctions similaires 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 de longue durée 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 entraîner des problèmes de performances ou des plantages.
N’oublie pas : chaque malloc() doit avoir un free() correspondant. Cette association est essentielle pour une gestion responsable de la mémoire en programmation C.
Défi
FacileÉcrivez un programme en C qui montre le cycle de vie complet de l’allocation et de la libération de mémoire dynamique. Votre programme doit :
- Lire un entier
countauprès de 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 auprès 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 libérer 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 montre l’association essentielle de malloc() et free() pour éviter les fuites de mémoire dans vos programmes.
Par exemple, si l’entrée est :
4
15 8 23 12Votre sortie doit être :
Memory allocated successfully!
Sum: 58
Maximum: 23
Memory freed successfully!Ce défi renforce le concept essentiel selon lequel chaque bloc de mémoire alloué dynamiquement doit être correctement libéré lorsqu’il n’est plus nécessaire, ce qui complète le cycle de gestion responsable de la mémoire en programmation C.
Essayez vous-même
#include <stdio.h>
#include <stdlib.h>
int main() {
int count;
// Lire le nombre d'entiers à stocker
scanf("%d", &count);
// TODO: É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 Logique & Flux
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 dynamiquesEntraînez-vous par vous-même : Compilateur C en ligne