C Academy · Leçon

Libérer la mémoire et éviter les fuites

Nettoyez correctement les ressources.

Leçon 4 sur 413 étapes

Libérer la mémoire et éviter les fuites est une leçon C Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C Academy comprend 4 leçons au total.

Chaque malloc nécessite un free

La mémoire du tas reste réservée jusqu'à ce que vous la libériez avec free. Si vous perdez l'unique pointeur vers un bloc sans le libérer, cette mémoire fuit.

Les fuites s'accumulent avec le temps et peuvent épuiser la mémoire des programmes qui s'exécutent longtemps.

int *a = malloc(100 * sizeof(*a));
/* ... use a ... */
free(a);

Ce que fait réellement free

free(p) rend le bloc à l'allocateur afin qu'il puisse être réutilisé. La fonction ne modifie pas la valeur de p elle-même.

Après free, p pointe toujours vers l'ancienne adresse, qui n'est désormais plus valide. Y accéder produit un comportement indéfini.

free(p);
/* p is now a dangling pointer */

Le piège du pointeur suspendu

Utiliser un pointeur après l'avoir libéré constitue une erreur d'utilisation après libération. Le programme peut sembler fonctionner, puis corrompre des données ou planter de manière imprévisible.

Une protection simple consiste à affecter NULL au pointeur juste après la libération.

free(a);
a = NULL;   /* now misuse is a clean NULL deref, easier to catch */

La double libération est indéfinie

Appeler free deux fois sur le même bloc corrompt l'état interne de l'allocateur et provoque souvent un plantage.

Mettre le pointeur à NULL après la première libération aide à éviter ce problème, car free(NULL) est explicitement sûr et ne fait rien.

free(a);
a = NULL;
free(a);   /* free(NULL) is a harmless no-op */

Ne libérer que ce qui a été alloué par malloc

Ne transmettez à free qu'un pointeur provenant de malloc, calloc ou realloc.

Libérer l'adresse d'une variable de pile, une chaîne littérale ou un pointeur situé au milieu d'un bloc produit un comportement indéfini.

int x = 5;
/* free(&x);   WRONG: x is on the stack */
int *p = malloc(sizeof(int));
free(p);        /* correct */

Fuite lors d'un retour anticipé

Une fuite courante se produit lorsque vous allouez de la mémoire, puis empruntez un chemin d'erreur qui effectue un retour avant la libération. Le bloc est alors perdu.

Assurez-vous que chaque chemin de sortie qui possède la mémoire la libère auparavant.

int *a = malloc(n * sizeof(*a));
if (something_failed) {
    free(a);   /* don't forget this before returning */
    return -1;
}

Un programme propre d'allocation et de libération

Ce programme alloue, utilise et libère la mémoire sur chaque chemin d'exécution, sans provoquer aucune fuite.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n = 4;
    int *a = malloc(n * sizeof(*a));
    if (!a) return 1;
    for (int i = 0; i < n; i++) a[i] = i + 1;
    int sum = 0;
    for (int i = 0; i < n; i++) sum += a[i];
    printf("%d\n", sum);
    free(a);
    a = NULL;
    return 0;
}

Libérer des allocations imbriquées

Si un bloc contient des pointeurs vers d'autres blocs, libérez d'abord les blocs internes, puis le bloc externe.

Libérer d'abord le bloc externe ferait perdre les adresses des blocs internes et provoquerait leur fuite.

for (size_t i = 0; i < rows; i++)
    free(grid[i]);   /* free each row first */
free(grid);          /* then the array of pointers */

Un propriétaire par bloc

Déterminez quelle partie de votre code possède chaque allocation et doit se charger de la libérer.

Si deux pointeurs désignent le même bloc et le libèrent tous les deux, vous provoquez une double libération. Une propriété clairement définie évite ce problème.

Détecter les fuites avec des outils

Vous n'avez pas besoin de rechercher les fuites à l'œil nu. Des outils comme valgrind ou AddressSanitizer signalent les fuites et les libérations invalides avec les numéros de ligne.

Compilez avec -g, puis exécutez le programme avec l'outil pour voir exactement ce qui n'a pas été libéré.

/* gcc -g -fsanitize=address prog.c && ./a.out */
/* or: valgrind --leak-check=full ./a.out */

Libérer dans l'ordre inverse de l'initialisation

Une habitude fiable consiste, dans une fonction qui acquiert plusieurs ressources, à les libérer dans l'ordre inverse de leur acquisition.

Cela reflète la manière dont les dépendances ont été construites et rend le nettoyage prévisible.

char *buf = malloc(64);
int  *idx = malloc(64 * sizeof(int));
/* ... use them ... */
free(idx);   /* free last-acquired first */
free(buf);

Vérification rapide

Vérifiez votre compréhension de la libération de la mémoire.

Récapitulatif

Associez exactement un free à chaque allocation, sur chaque chemin d'exécution.

Évitez les pointeurs suspendus et les doubles libérations en affectant NULL aux pointeurs après la libération. Libérez les allocations imbriquées en commençant par l'intérieur, attribuez un propriétaire à chaque bloc et utilisez valgrind ou ASan pour détecter les fuites. Vous disposez maintenant de tous les outils nécessaires aux tableaux dynamiques.

Gratuit pour commencer

Apprends C avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
39
Leçons
144

Questions Fréquemment Posées

La leçon « Libérer la mémoire et éviter les fuites » est-elle gratuite ?

Oui — le texte complet de « Libérer la mémoire et éviter les fuites » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C Academy, passe à CoddyKit PRO. Le cours C Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Libérer la mémoire et éviter les fuites » ?

Nettoyez correctement les ressources. Tu pratiques C Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer C Academy ?

Aucune expérience préalable n'est requise. C Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Libérer la mémoire et éviter les fuites » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon C Academy ?

Oui. Chaque leçon C Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Allouer un tableau
  2. Agrandir avec realloc
  3. Un type vecteur réutilisable
  4. Libérer la mémoire et éviter les fuites
← Retour à C Academy