0Pricing
C Academy · Leçon

Détecter les fuites

Bases de memcheck

Détecter les fuites est une leçon C Academy gratuite sur CoddyKit. Ceci est la leçon 2 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.

Qu'est-ce qu'une fuite ?

Une fuite mémoire se produit lorsque vous allouez de la mémoire du tas avec malloc, calloc ou realloc et perdez tous les pointeurs qui y mènent avant d'appeler free.

Le bloc reste réservé mais inaccessible jusqu'à la fin du processus. Dans les programmes qui s'exécutent longtemps, les fuites s'accumulent jusqu'à épuiser la mémoire.

Une fuite minimale

Ce programme provoque une fuite d'un bloc de 40 octets.

Le pointeur p est une variable locale. Lorsque main retourne, p disparaît, mais le bloc du tas vers lequel il pointait n'est jamais libéré.

#include <stdlib.h>

int main(void) {
    int *p = malloc(10 * sizeof(int));
    p[0] = 1;
    return 0; /* never free(p) */
}

Exécuter memcheck

memcheck est l'outil par défaut : vous pouvez donc omettre le nom de l'outil.

Ajoutez --leak-check=full pour obtenir une trace de la pile pour chaque allocation ayant fui.

gcc -g -O0 -o leak leak.c
valgrind --leak-check=full ./leak

Le LEAK SUMMARY

À la fin de l'exécution, Valgrind affiche un LEAK SUMMARY. Pour le programme ci-dessus, il indique approximativement :

definitely lost: 40 bytes in 1 blocks

La trace pointe vers l'emplacement exact de l'appel à malloc, ce qui vous permet de savoir précisément quelle allocation n'a jamais été libérée.

Les quatre catégories de fuites

memcheck classe la mémoire perdue en quatre catégories :

  • definitely lost — aucun pointeur ne subsiste : il s'agit d'une véritable fuite
  • indirectly lost — accessible uniquement par l'intermédiaire d'un bloc définitivement perdu
  • possibly lost — seul un pointeur intérieur subsiste
  • still reachable — un pointeur existe à la fin, mais vous ne l'avez jamais libéré

Définitivement perdu ou encore accessible

definitely lost est la catégorie urgente : ces octets ne pourront jamais être récupérés tant que le programme s'exécute.

still reachable est moins grave. Le bloc est perdu à la fin de l'exécution, mais un pointeur global ou statique y fait encore référence. Il s'agit donc généralement d'une allocation unique que vous n'avez simplement jamais pris le temps de libérer.

Fuites indirectes

Lorsque vous perdez la tête d'une structure chaînée, chaque nœud devient inaccessible.

La tête apparaît comme definitely lost et le reste comme indirectly lost. Corriger la cause première, c'est-à-dire la tête perdue, permet de tout récupérer.

struct Node { int v; struct Node *next; };

struct Node *make(void) {
    struct Node *h = malloc(sizeof *h);
    h->next = malloc(sizeof *h);
    h->next->next = NULL;
    return h;
}
/* if the caller drops the returned head, both nodes leak */

La version corrigée

Libérez ce que vous allouez. Cette version ne provoque aucune fuite.

Avec Valgrind, elle affiche All heap blocks were freed -- no leaks are possible.

#include <stdlib.h>

int main(void) {
    int *p = malloc(10 * sizeof(int));
    p[0] = 1;
    free(p);
    return 0;
}

Compter les allocations

Même en l'absence de fuites, le HEAP SUMMARY vous indique l'activité de votre programme :

total heap usage: 1 allocs, 1 frees, 40 bytes allocated

Lorsque le nombre d'allocations et de libérations correspond, l'exécution est propre. Une différence est votre premier indice que quelque chose a échappé à votre contrôle.

Afficher les blocs encore accessibles

Par défaut, memcheck ne détaille pas les blocs still reachable. Pour les examiner également, ajoutez :

--show-leak-kinds=all

Cela force l'affichage d'une trace pour chaque catégorie, ce qui est utile lorsque vous voulez qu'un programme libère absolument tout avant de se terminer.

valgrind --leak-check=full --show-leak-kinds=all ./leak

Les fuites sur les chemins d'erreur

Les fuites les plus sournoises se cachent dans les chemins de retour anticipé. Ici, si la deuxième allocation échoue, le premier bloc fuit.

Les tests ordinaires empruntent rarement ces branches, mais memcheck les détecte chaque fois que le chemin est exécuté. Libérez toujours ce que vous détenez avant de retourner en cas d'erreur.

char *a = malloc(100);
char *b = malloc(100);
if (!b) {
    /* bug: a is leaked here */
    return -1;
}
/* fix: free(a); before returning */

Vérification rapide

Choisissez la catégorie de fuite qui exige l'attention la plus urgente.

Récapitulatif

Vous pouvez maintenant détecter les fuites avec memcheck :

  • Exécutez valgrind --leak-check=full ./prog sur un binaire compilé avec -g
  • Lisez le LEAK SUMMARY et le HEAP SUMMARY
  • Traitez en priorité definitely lost, puis remontez les fuites indirectes jusqu'à leur origine
  • Utilisez --show-leak-kinds=all pour examiner les blocs encore accessibles

Ensuite : les accès mémoire invalides.

Questions Fréquemment Posées

La leçon « Détecter les fuites » est-elle gratuite ?

Oui — le texte complet de « Détecter 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 « Détecter les fuites » ?

Bases de memcheck 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 2 sur 4.

Combien de temps prend la leçon « Détecter 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. Pourquoi Valgrind
  2. Détecter les fuites
  3. Accès invalide
  4. Lire les rapports
← Retour à C Academy