200 likes | 496 Views
Gestion dynamique de la mémoire. Méthode et Outils pour la Programmation Françoise Greffier Claude Daval-Frerot. Notion de pointeur. Application en langage C++. Gestion dynamique de la mémoire. Un modèle simplifié de la mémoire Gestion dynamique : intérêt Notion de pointeur
E N D
Gestion dynamique de la mémoire Méthode et Outils pour la Programmation Françoise Greffier Claude Daval-Frerot Notion de pointeur Application en langage C++
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)
Adresse Contenu LA MEMOIRE DESCRIPTION PHYSIQUE : Chaque emplacement mémoire est décrit par - Une adresse pour localiser son emplacement, - Un contenu (appelé une donnée)
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
S T A T I Q U E Identificateur Adresse Contenu T AS MÉMOIRE : LE MODÈLE
S T A T I Q U E Identificateur Adresse Contenu ‘\0’ ‘u’ ‘d’ 2 c[0] 0100:0003 ? c[1] 0100:0004 ? k=2; c[2] 0100:0005 ? T AS Mémoire statique (exemple) k 0100:0002 ? int k; 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 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
Identif. Adresse Contenu Ptr est une variable (statique) de type pointeur sur int. Elle est non définie 0200:0004 L ’instruction new retourne une adresse du TAS. 0200:0004 ? GESTION DYNAMIQUE - EXEMPLE int* ptr; ptr 0100:0002 ? Ptr=new int; Cette adresse(0200:0004) est affectée à ptr.
Identif. Adresse Contenu ptr 0100:0002 ? 0200:0004 int* ptr; Ptr=new int; *ptr est l ’identificateur de la valeur pointée par ptr. 0200:0004 ? 4 GESTION DYNAMIQUE - EXEMPLE *ptr *ptr = 4; Nous avons alloué un entier puis nous lui avons affecté la valeur 4
Identif. Adresse Contenu ? ptr 0100:0002 ? 0200:0004 int* ptr; Ptr=new int; *ptr = 4; 0200:0004 ? *ptr 4 On n ’a plus besoin de l ’entier alloué. On remet la mémoire précédemment allouée, à disposition du tas. GESTION DYNAMIQUE - EXEMPLE delete ptr;
Identif. Adresse Contenu ptr 0100:0002 ? 0200:0004 int* ptr; ptr1 0100:0003 ?0200:0004 Ptr=new int; *ptr = 4; 0200:0004 ? *ptr 4 int * ptr1; ptr1=ptr; AFFECTATION DE POINTEURS Les pointeurs ptr et ptr1 pointent tous les deux sur le même entier égal à 4.
Identif. Adresse Contenu NULL Quand un pointeur a pour valeur NULL, ce pointeur pointe sur aucun emplacement mémoire. CONSTANTE NULL ptr 0100:0002 ? int* ptr; Ptr = NULL;
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 libération • de cet emplacement (delete). • Attribuer des noms de variables explicites : • ptr pour les pointeurs.