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

1 529 vues

Publié le

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

Publié dans : Technologie
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
1 529
Sur SlideShare
0
Issues des intégrations
0
Intégrations
2
Actions
Partages
0
Téléchargements
142
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

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

  1. 1. Programmation Orientée Objet en C++ 5ème Partie: Mémoire Dynamique Fabio Hernandez Fabio.Hernandez@in2p3.fr
  2. 2. Vue dEnsemble Notions de base Types, variables, opérateurs Contrôle dexécution Fonctions Mémoire dynamique Qualité du logiciel Evolution du modèle objet Objets et classes Fonctions membres Classes génériques Héritage Polymorphisme Héritage multiple Entrée/sortiePOO en C++: Mémoire Dynamique 138 © 1997-2003 Fabio HERNANDEZ
  3. 3. Table des Matières Motivation Environnement dexécution Allocation DésallocationPOO en C++: Mémoire Dynamique 139 © 1997-2003 Fabio HERNANDEZ
  4. 4. Motivation La quantité de données à traiter dans un programme peut être inconnue à priori En plus, elle peut varier dune exécution du programme à une autre Comment faire pour réserver la mémoire nécessaire pour stocker ces données pendant lexécution du programme, si au moment de la compilation cette quantité est inconnue? C++ fournit une méthode dallocation de mémoire en temps dexécution du programme: mémoire dynamique, par opposition à la mémoire statique (allouée en temps de compilation)POO en C++: Mémoire Dynamique 140 © 1997-2003 Fabio HERNANDEZ
  5. 5. Environnement dexécution Lors de lexécution dun programme, le système dexploitation met en place son environnement Quatre zones mémoire à vocation différente instructions du programme données pile dexécution (stack) tas (heap) Les variables globales et les variables définies static sont stockées dans la zone de données La pile est utilisée pour stocker les paramètres, les variables locales, les adresses et valeur de retour des fonctions Le tas est réservé pour satisfaire les demandes dallocation de mémoire dynamiquePOO en C++: Mémoire Dynamique 141 © 1997-2003 Fabio HERNANDEZ
  6. 6. Allocation Les objets alloués en mémoire dynamique sont manipulés via des pointeurs La mémoire du tas nest pas initialisée Exemple: allocation dun entier int* intPointer = new int; intPointer ?????? sizeof(int) zone de mémoire dans le tasPOO en C++: Mémoire Dynamique 142 © 1997-2003 Fabio HERNANDEZ
  7. 7. Allocation (suite) Un objet en mémoire dynamique est alloué en appliquant lopérateur new sur un type (ou classe) préalablement défini(e) new retourne un pointeur à lobjet intPointer zones déjà allouées tasPOO en C++: Mémoire Dynamique 143 © 1997-2003 Fabio HERNANDEZ
  8. 8. Allocation (suite) On peut aussi allouer un tableau dobjets int arrayDimension = 259; int* intArray = new int[arrayDimension]; Il faut initialiser chacun de ces objets for (int i=0; i < arrayDimension; ++i) intArray[i] = 0; new retourne zéro si lallocation na pas pu être faite épuisement de la mémoire dynamique fragmentation du tasPOO en C++: Mémoire Dynamique 144 © 1997-2003 Fabio HERNANDEZ
  9. 9. Allocation (suite) Exemple: duplication dune chaîne de caractères voir 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èque standard du CPOO en C++: Mémoire Dynamique 145 © 1997-2003 Fabio HERNANDEZ
  10. 10. Désallocation A la fin de lexécution le système dexploitation récupère toutes les zones mémoire de lenvironnement du programme Les objets alloués en mémoire dynamique existent jusquà leur désallocation explicite ou jusquà la fin de lexécution La désallocation explicite est faite en appliquant lopérateur delete sur un pointeur à un objet en mémoire dynamique int* intPointer = new int; // use intPointer... Désallocation delete intPointer; explicite Désallocation dun tableau int* intArray = new int[arrayDimension]; // use intArray... delete [] intArray;POO en C++: Mémoire Dynamique 146 © 1997-2003 Fabio HERNANDEZ
  11. 11. Désallocation (suite) La mémoire libérée par delete peut être réutilisée par le système pour satisfaire une demande ultérieure dallocation Lopérateur delete ne peut être appliqué quaux 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 const delete [] message; // OKPOO en C++: Mémoire Dynamique 147 © 1997-2003 Fabio HERNANDEZ
  12. 12. Désallocation (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à 139 allouées intPointer = new int; // WARNING: memory leak !!!POO en C++: Mémoire Dynamique 148 © 1997-2003 Fabio HERNANDEZ
  13. 13. Désallocation (suite) fuites de mémoire (suite) intPointer zones déjà 139 allouées ???POO en C++: Mémoire Dynamique 149 © 1997-2003 Fabio HERNANDEZ
  14. 14. Désallocation (suite) Exemple: allocation de mémoire jusquà lépuisement du tas const 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;POO en C++: Mémoire Dynamique 150 © 1997-2003 Fabio HERNANDEZ

×