Trouver et éliminer les Memory Leak

Définition

Les Memory Leak ou fuite de mémoire en français apparaissent lorsqu’un programme ne désalloue pas tout ce qu’il a auparavant alloué en mémoire RAM. La problématique des Memory Leak intervient donc lorsque ce même programme ne rend pas l’ensemble de la RAM à l’OS (operating system / système d’exploitation).

Alerte : unmanaged code détecté
Il vous faut faire très attention au code non managé (unmanaged code en anglais). Ce code est natif, c’est à dire interprété directement par le processeur. Cette partie du code qui s’exécute alors sans machine virtuelle ni run time rend la gestion mémoire bien plus compliquée.

Exemples de langage de programmation en unmanaged code : C / C++ / ASM

Cas concret

Prenons l’exemple des jeux vidéos. Un tel programme nécessite une bonne gestion mémoire du fait qu’il est amené à tourner régulièrement et surtout durant plusieurs heures consécutives. Ne vous ait-il jamais arrivé d’avoir l’impression qu’au fur et à mesure de votre avancée dans le jeu les sauvegardes étaient plus longues et les temps de chargement aussi ? Sachez que ce problème (et bien d’autres…) peuvent être liés à une mauvaise gestion mémoire du programme.

Dans un jeu vidéo, on trouve des « objets » animés et inanimés que l’on est amené à détruire, modifier, bouger. Selon toute logique la RAM allouée à ces objets devrait alors être libérée ou réutilisée pour de nouveaux objet. C’est malheureusement trop souvent le cas contraire qui se produit et le résultat est inéluctable : le jeu tourne trop longtemps sans désallouer la RAM et termine par avaler toute cette dernière. Finalité ? Le jeu devient très lent et peut même s’éteindre brutalement.

Le plus souvent sur PC, Windows fini par tuer l’application ou l’application finit par tout simplement planter car elle ne vérifie pas toujours l’état de sa RAM. Cet exemple peut s’appliquer à tout type de programme contenant des allocations dynamiques (gestion de RAM dynamique). L’OS (operating system) va le plus souvent essayer de protéger l’application en utilisant le disque dur en tant que RAM sauf qu’il n’ait pas conçu pour ça car cela demande trop d’écriture/lecture.

Retour d’expérience

Nicolas, l’un de nos Insiders nous fait part de son retour d’expérience en la matière :

« En tant qu’assistant pédagogique dans une grande école, j’ai vu Maxime*, l’un des étudiants, qui – lors d’un projet de « take adventure** » en langage C, a créé un beau générique. L’étudiant, pourtant persuadé d’être sur la bonne voie, n’a désalloué aucun des textes du générique (chaîne de caractère). Maxime a par ailleurs alloué ses textes à chaque image ; soit 60x par seconde étant donné que le VSync était activé et que la fréquence maximale de l’écran était de 60Hz. Le tout sur un PC portable de seulement 8 gigas de RAM.

Vous imaginez bien ce qui a pu se passer ? L’application a vu sa lenteur augmenter crescendo. Dans ce cas bien précis, c’est l’application elle-même qui n’a pas vérifié la RAM car Maxime a utilisé une fonction malloc qui retourne un pointeur vers la mémoire allouée et prend en paramètre le nombre d’octets que l’on souhaite allouer. Afin de réussir à désallouer, il faut ensuite utiliser la fonction free afin de libérer la RAM. 

Donc en ne vérifiant pas le retour de malloc, qui lorsque qu’il n’y a plus de RAM retourne NULL, le programme de Maxime a tout simplement fini par planter.

*
Le nom a été modifié.

**
Take Adventure est un jeu d’aventure en 2D utilisé dans certaines écoles pour les examens et projets.

Les solutions existantes

Il existe différents outils et diverses méthodes permettant de s’extirper des problématiques de Memory Leak. En voici deux : RAII et Valgrind.

RAII & Memory Leak

Le RAII est une technique utilisée en Orient Objet (notamment en C++). En théorie, si celle-ci est respecté, RAII permet d’éliminer tous les Memory Leak. Retrouvez l’ensemble de notre article sur le RAII ici.

Valgrind & Memory Leak

Valgrind fonctionne en remplaçant les fonctions systèmes d’allocation mémoire (malloc/free) et « remplace certaines instructions » afin de vérifier les adresses d’accès mémoires.

Avant de donner les instructions nécessaires, Valgrind vérifie toutes les instructions liées à la gestion de la RAM et permet ainsi d’identifier les éléments d’un programme qui ont alloué de la mémoire qui n’a pas été désalloué ainsi que les éléments qui tentent d’écrire ou de lire des adresses qui n’auraient pas été alloué par celui-ci.

Memory Leak