cours La mémoire : qui possède quoi 1/5

Le logger qui fuit

Une fonction alloue, personne ne libère. Trouvez le propriétaire et faites libérer le buffer au bon endroit.

Leçon

L'idée : chaque malloc a un propriétaire

En C, personne ne libère la mémoire à votre place. Pour chaque bloc alloué, un seul morceau de code est responsable d'appeler free, exactement une fois. C'est le propriétaire.

Un commentaire dans un header dit souvent qui est le propriétaire. Lisez-le : « The CALLER owns the result. »

La situation

make_greeting alloue une chaîne et la distribue. log_greeting l'utilise, l'affiche et retourne. Le test appelle log_greeting cent fois.

Votre mission

Trouvez le propriétaire, puis dites au junior quelle fonction doit appeler free, sur quelle variable, et à quel endroit. « Corrige la fuite » n'est pas une instruction, c'est un souhait.

À surveiller

  • Une demande vague pousse le junior vers le premier raccourci venu. Vérifiez ce qu'il a fait avant de lui faire confiance.
  • Libérer dans la mauvaise fonction est pire que ne pas libérer : une fuite devient un crash.
  • Certains tests sont cachés. Ils vérifient les cas auxquels vous n'avez pas pensé.

Essayez cet exercice

Créez un compte gratuit pour dire au junior IA quoi changer, lancer les tests et le vérificateur mémoire, et obtenir un code de complétion vérifiable.

Code de départ
greeter.c
#include "greeter.h"#include <stdlib.h>#include <string.h> char *make_greeting(const char *name) {    size_t n = strlen("Hello, !") + strlen(name) + 1;    char *s = malloc(n);    if (!s) return NULL;    snprintf(s, n, "Hello, %s!", name);    return s;} int log_greeting(FILE *out, const char *name) {    char *g = make_greeting(name);    if (!g) return -1;    int len = fprintf(out, "%s\n", g);    return len;}
greeter.h
#ifndef GREETER_H#define GREETER_H#include <stdio.h> /* Builds "Hello, <name>!" in a new heap buffer. The CALLER owns the result. */char *make_greeting(const char *name); /* Writes "Hello, <name>!\n" to `out`. Returns characters written, or -1. */int log_greeting(FILE *out, const char *name);#endif