Partie 5: Mémoire Dynamique — Programmation orientée objet en C++

14
Fabio Hernandez [email protected] Programmation Orientée Objet en C++ Programmation Orientée Objet en C++ 5ème Partie: Mémoire Dynamique 5ème Partie: Mémoire Dynamique

description

Support material for a continued education course "Introduction to object oriented programming in C++". In French.

Transcript of Partie 5: Mémoire Dynamique — Programmation orientée objet en C++

Page 1: Partie 5: Mémoire Dynamique — Programmation orientée objet en C++

Fabio [email protected]

Programmation Orientée Objet en C++Programmation Orientée Objet en C++

5ème Partie: Mémoire Dynamique5ème Partie: Mémoire Dynamique

Page 2: Partie 5: Mémoire Dynamique — Programmation orientée objet en C++

© 1997-2003 Fabio HERNANDEZ138POO en C++: Mémoire Dynamique

Vue d'EnsembleVue d'Ensemble

Notions de base Types, variables, opérateursContrôle d'exécutionFonctionsMémoire dynamiqueQualité du logicielEvolution du modèle objet Objets et classesFonctions membresClasses génériquesHéritagePolymorphismeHéritage multipleEntrée/sortie

Page 3: Partie 5: Mémoire Dynamique — Programmation orientée objet en C++

© 1997-2003 Fabio HERNANDEZ139POO en C++: Mémoire Dynamique

Table des MatièresTable des Matières

MotivationEnvironnement d'exécutionAllocationDésallocation

Page 4: Partie 5: Mémoire Dynamique — Programmation orientée objet en C++

© 1997-2003 Fabio HERNANDEZ140POO en C++: Mémoire Dynamique

MotivationMotivation

La quantité de données à traiter dans un programme peut être inconnue à prioriEn plus, elle peut varier d'une exécution du programme à une autreComment faire pour réserver la mémoire nécessaire pour stocker ces données pendant l'exécution du programme, si au moment de la compilation cette quantité est inconnue?C++ fournit une méthode d'allocation de mémoire en temps d'exécution du programme: mémoire dynamique, par opposition à la mémoire statique (allouée en temps de compilation)

Page 5: Partie 5: Mémoire Dynamique — Programmation orientée objet en C++

© 1997-2003 Fabio HERNANDEZ141POO en C++: Mémoire Dynamique

Environnement d'exécutionEnvironnement d'exécution

Lors de l'exécution d'un programme, le système d'exploitation met en place son environnementQuatre zones mémoire à vocation différente

instructions du programmedonnéespile d'exécution (stack)tas (heap)

Les variables globales et les variables définies static sont stockées dans la zone de donnéesLa pile est utilisée pour stocker les paramètres, les variables locales, les adresses et valeur de retour des fonctionsLe tas est réservé pour satisfaire les demandes d'allocation de mémoire dynamique

Page 6: Partie 5: Mémoire Dynamique — Programmation orientée objet en C++

© 1997-2003 Fabio HERNANDEZ142POO en C++: Mémoire Dynamique

AllocationAllocation

Les objets alloués en mémoire dynamique sont manipulés via des pointeursLa mémoire du tas n'est pas initialiséeExemple: allocation d'un entier

int* intPointer = new int;

?????? sizeof(int)

intPointer

zone de mémoire dans le tas

Page 7: Partie 5: Mémoire Dynamique — Programmation orientée objet en C++

© 1997-2003 Fabio HERNANDEZ143POO en C++: Mémoire Dynamique

Allocation (suite)Allocation (suite)

Un objet en mémoire dynamique est alloué en appliquant l'opérateur new sur un type (ou classe) préalablement défini(e)new retourne un pointeur à l'objet

tas

intPointer zones déjàallouées

Page 8: Partie 5: Mémoire Dynamique — Programmation orientée objet en C++

© 1997-2003 Fabio HERNANDEZ144POO en C++: Mémoire Dynamique

Allocation (suite)Allocation (suite)

On peut aussi allouer un tableau d'objetsint arrayDimension = 259;

int* intArray = new int[arrayDimension];

Il faut initialiser chacun de ces objetsfor (int i=0; i < arrayDimension; ++i)

intArray[i] = 0;

new retourne zéro si l'allocation n'a pas pu être faiteépuisement de la mémoire dynamiquefragmentation du tas

Page 9: Partie 5: Mémoire Dynamique — Programmation orientée objet en C++

© 1997-2003 Fabio HERNANDEZ145POO en C++: Mémoire Dynamique

Allocation (suite)Allocation (suite)

Exemple: duplication d'une chaîne de caractèresvoir routine standard strdup()

#include <string.h>

char* duplicateString(const char* aString)

{if (aString == 0)

return 0;

char* copy = new char[strlen(aString) + 1];strcpy(copy, aString);return copy;

}

le fonctions strlen() et strcpy() font partie de la bibliotèquestandard du C

Page 10: Partie 5: Mémoire Dynamique — Programmation orientée objet en C++

© 1997-2003 Fabio HERNANDEZ146POO en C++: Mémoire Dynamique

DésallocationDésallocation

A la fin de l'exécution le système d'exploitation récupère toutes les zones mémoire de l'environnement du programmeLes objets alloués en mémoire dynamique existent jusqu'à leur désallocation explicite ou jusqu'à la fin de l'exécutionLa désallocation explicite est faite en appliquant l'opérateurdelete sur un pointeur à un objet en mémoire dynamique

int* intPointer = new int;// use intPointer...delete intPointer;

Désallocation d'un tableauint* intArray = new int[arrayDimension];// use intArray...delete [] intArray;

Désallocationexplicite

Page 11: Partie 5: Mémoire Dynamique — Programmation orientée objet en C++

© 1997-2003 Fabio HERNANDEZ147POO en C++: Mémoire Dynamique

DésallocationDésallocation (suite)(suite)

La mémoire libérée par delete peut être réutilisée par le système pour satisfaire une demande ultérieure d'allocationL'opérateur delete ne peut être appliqué qu'aux pointeurs aux objets alloués via new

const int MaxLength = 255;

char* message = new char[MaxLength];

// use "message" here

const char* aPointer = message;

// use "aPointer" here

delete [] aPointer; // ERROR: aPointer is constdelete [] message; // OK

Page 12: Partie 5: Mémoire Dynamique — Programmation orientée objet en C++

© 1997-2003 Fabio HERNANDEZ148POO en C++: Mémoire Dynamique

DésallocationDésallocation (suite)(suite)

Les zones mémoires non libérées explicitement sont connues comme les fuites de mémoire (memory leak)

int* intPointer = new int;

*intPointer = 139;

cout << "*intPointer is " << *intPointer << endl;

intPointer zones déjàallouées139

intPointer = new int; // WARNING: memory leak !!!

Page 13: Partie 5: Mémoire Dynamique — Programmation orientée objet en C++

© 1997-2003 Fabio HERNANDEZ149POO en C++: Mémoire Dynamique

DésallocationDésallocation (suite)(suite)

intPointer zones déjàallouées139

???

fuites de mémoire (suite)

Page 14: Partie 5: Mémoire Dynamique — Programmation orientée objet en C++

© 1997-2003 Fabio HERNANDEZ150POO en C++: Mémoire Dynamique

DésallocationDésallocation (suite)(suite)

Exemple: allocation de mémoire jusqu'à l'épuisement du tasconst int MegaByte = 1024*1024;

char* pointer;

long megas = 0;

while (true) {

pointer = new char[MegaByte];

if (pointer == 0) // no more memory available

break;

megas++; // increment counter

}

cout << "Total allocated memory: " << megas

<< " Megabytes" << endl;