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
© 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
© 1997-2003 Fabio HERNANDEZ139POO en C++: Mémoire Dynamique
Table des MatièresTable des Matières
MotivationEnvironnement d'exécutionAllocationDésallocation
© 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)
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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 !!!
© 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)
© 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;
Top Related