Gestion mémoire & pointeurs
Progression
#Gestion de la mémoire et pointeurs
Cette étape du module installe une discipline de gestion mémoire. Nous démarrons avec les primitives d’allocation (malloc, calloc, realloc, free) et illustrons, à l’aide d’un tampon dynamique, pourquoi la convention « celui qui alloue libère » doit être documentée par du code (structures, fonctions d’initialisation et de destruction). À travers le suivi d’un bug concret, nous visualisons ce qui se passe quand un tampon est réaloué puis partagé sans précautions.
Les pointeurs sont ensuite abordés dans des situations variées. Nous manipulons des pointeurs de fonction pour écrire un qsort personnalisé, décortiquons l’utilisation de void * dans les API génériques et expliquons les pointeurs de pointeurs (char **argv) via la construction d’un mini interpréteur de commandes. Les étudiants apprennent à lire et à écrire ces signatures intimidantes en les reliant à des cas concrets.
Dernier bloc : l’outillage. Nous montrons comment activer les sanitizers (-fsanitize=address,undefined) pour détecter les erreurs de mémoire au plus tôt, puis comment compléter l’analyse avec Valgrind (memcheck) afin de valider qu’un projet plus conséquent reste sans fuite. Les ateliers demandent d’écrire un allocateur de pool et un vector générique, l’objectif étant de manipuler ces outils dès l’implémentation.
#Atelier
Pour mettre en pratique ces concepts, vous allez implémenter un allocateur de pool (une "arena") en utilisant un simple malloc initial suivi d'une stratégie de "bump allocation". Ensuite, vous créerez un vector générique en utilisant void * et des macros pour gérer différents types de données de manière flexible.