Programmation Orientée Objet en C++      5ème Partie: Mémoire Dynamique               Fabio Hernandez             Fabio.He...
Vue dEnsemble   Notions de base   Types, variables, opérateurs   Contrôle dexécution   Fonctions   Mémoire dynamique   Qua...
Table des Matières   Motivation   Environnement dexécution   Allocation   DésallocationPOO en C++: Mémoire Dynamique      ...
Motivation   La quantité de données à traiter dans un programme peut être   inconnue à priori   En plus, elle peut varier ...
Environnement dexécution   Lors de lexécution dun programme, le système dexploitation   met en place son environnement   Q...
Allocation   Les objets alloués en mémoire dynamique sont manipulés via   des pointeurs   La mémoire du tas nest pas initi...
Allocation (suite)   Un objet en mémoire dynamique est alloué en appliquant   lopérateur new sur un type (ou classe) préal...
Allocation (suite)   On peut aussi allouer un tableau dobjets          int arrayDimension = 259;          int* intArray = ...
Allocation (suite)   Exemple: duplication dune chaîne de caractères         voir routine standard strdup()          #inclu...
Désallocation   A la fin de lexécution le système dexploitation récupère   toutes les zones mémoire de lenvironnement du p...
Désallocation (suite)   La mémoire libérée par delete peut être réutilisée par le   système pour satisfaire une demande ul...
Désallocation (suite)   Les zones mémoires non libérées explicitement sont connues   comme les fuites de mémoire (memory l...
Désallocation (suite)   fuites de mémoire (suite)          intPointer                             zones                   ...
Désallocation (suite)   Exemple: allocation de mémoire jusquà lépuisement du tas          const int MegaByte = 1024*1024; ...
Prochain SlideShare
Chargement dans…5
×

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

1 465 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 465
Sur SlideShare
0
Issues des intégrations
0
Intégrations
2
Actions
Partages
0
Téléchargements
123
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

×