Méthode et Outils pour la Programmation Gestion dynamique de la mémoire Licence informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier Claude Daval-Frérot
Gestion dynamique de la mémoire Un modèle simplifié de la mémoire Gestion dynamique : intérêt Notion de pointeur Trace en mémoire sur des exemples Opérations sur les pointeur
LA MÉMOIRE EXECUTION LOGIQUE D ’UN PROGRAMME : On distingue trois parties : Code Pile Données implantées - en mémoire statique ou - en mémoire dynamique (le TAS)
LA MEMOIRE DESCRIPTION PHYSIQUE : Chaque emplacement mémoire est décrit par - Une adresse pour localiser son emplacement, - Un contenu (appelé une donnée) Adresse Contenu
MODELE SIMPLIFIE On simplifie les points suivants : Différents types de codage des données Le nombre d ’octets des données La localisation et les limites du TAS Les mécanismes de segmentation de la mémoire On considère la mémoire sous cette forme : Les données sont implantées en mémoire dans deux zones: - une zone mémoire statique - une zone mémoire dynamique (appelée TAS) Un emplacement mémoire est défini par : - une adresse - un contenu (donnée) - un identificateur
MÉMOIRE : LE MODÈLE S T A I Q U E Identificateur Adresse Contenu T A S
Mémoire statique (exemple) A S Identificateur Adresse Contenu 2 k 0100:0002 ? ‘d’ c[0] 0100:0003 ? c[1] 0100:0004 ? c[2] 0100:0005 ? int k; ‘u’ k=2; ‘\0’ lettre 0100:0006 ‘u’ char c[3]; char lettre=‘u‘; c[0]=‘d’; c[1]= lettre; c[2]= ‘\0’;
GESTION DYNAMIQUE INTÉRÊT : Disposer d ’emplacements en mémoire, utiles à une application, au fur et à mesure de l ’exécution d ’une application. Ainsi : plus besoin d ’anticiper sur la taille maximum d ’une collection. Exemple : char c [3]; //taille maximum de la chaîne = 2 En outre, le TAS est un espace mémoire plus grand que la zone statique.
GESTION DYNAMIQUE Gestion dynamique (au fur et à mesure …) : Deux instructions sont utiles: une, pour réserver (ou allouer) un emplacement mémoire dans le TAS une, pour libérer (désallouer) la mémoire : remettre la mémoire précédemment allouée à disposition du TAS new en C/C++ delete en C/C++
GESTION DYNAMIQUE Un pointeur est une variable Pour pouvoir effectuer les deux opérations : allouer et libérer un emplacement mémoire dans le TAS, il faut manipuler et donc désigner les emplacements mémoire. Or, à chaque emplacement mémoire est associé une adresse. On va donc manipuler des adresses. Un pointeur est une variable qui a pour valeur (contenu) l’adresse d ’un emplacement mémoire généralement issu du TAS
GESTION DYNAMIQUE - EXEMPLE int* ptr; Identif. Adresse Contenu Ptr est une variable (statique) de type pointeur sur int. Elle est non définie 0200:0004 ? 0200:0004 ptr 0100:0002 ? Ptr=new int; L ’instruction new retourne une adresse du TAS. Cette adresse(0200:0004) est affectée à ptr.
GESTION DYNAMIQUE - EXEMPLE ptr 0100:0002 ? 0200:0004 ? 0200:0004 Identif. Adresse Contenu int* ptr; Ptr=new int; *ptr est l ’identificateur de la valeur pointée par ptr. *ptr 4 *ptr = 4; Nous avons alloué un entier puis nous lui avons affecté la valeur 4
GESTION DYNAMIQUE - EXEMPLE ptr 0100:0002 ? 0200:0004 ? 0200:0004 Identif. Adresse Contenu *ptr 4 ? int* ptr; Ptr=new int; *ptr = 4; delete ptr; On n ’a plus besoin de l ’entier alloué. On remet la mémoire précédemment allouée, à disposition du tas.
AFFECTATION DE POINTEURS ptr 0100:0002 ? 0200:0004 ? 0200:0004 Identif. Adresse Contenu *ptr 4 int* ptr; Ptr=new int; *ptr = 4; ptr1 0100:0003 ?0200:0004 int * ptr1; ptr1=ptr; Les pointeurs ptr et ptr1 pointent tous les deux sur le même entier égal à 4.
CONSTANTE NULL Identif. Adresse Contenu ptr 0100:0002 ? NULL int* ptr; Quand un pointeur a pour valeur NULL, ce pointeur pointe sur aucun emplacement mémoire.
DONNER UNE VALEUR À UN POINTEUR Il existe trois façons de donner une valeur à un pointeur Instruction new Affectation d’un autre pointeur Affectation de la valeur NULL, ou de la valeur d ’une adresse
NOTATIONS On a la possibilité de désigner Ptr : variable de type pointeur *ptr : valeur pointée par ptr &ptr : l ’adresse de la variable ptr int k; k=2; int * ptr; ptr=&k; c[2]= ‘\0’;
Bonne gestion de la mémoire A chaque réservation d ’un emplacement mémoire (new) doit correspondre une et une seule libération de cet emplacement (delete) Attribuer des noms de variables explicites : ptr pour les pointeurs.