SlideShare une entreprise Scribd logo
1  sur  14
Télécharger pour lire hors ligne
Programmation Orientée Objet en C++
      5ème Partie: Mémoire Dynamique



               Fabio Hernandez
             Fabio.Hernandez@in2p3.fr
Vue d'Ensemble
   Notions de base
   Types, variables, opérateurs
   Contrôle d'exé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/sortie


POO en C++: Mémoire Dynamique         138        © 1997-2003 Fabio HERNANDEZ
Table des Matières

   Motivation
   Environnement d'exécution
   Allocation
   Désallocation




POO en C++: Mémoire Dynamique           139          © 1997-2003 Fabio HERNANDEZ
Motivation

   La quantité de données à traiter dans un programme peut être
   inconnue à priori
   En plus, elle peut varier d'une exécution du programme à une
   autre
   Comment 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)




POO en C++: Mémoire Dynamique       140        © 1997-2003 Fabio HERNANDEZ
Environnement d'exécution

   Lors de l'exécution d'un programme, le système d'exploitation
   met en place son environnement
   Quatre zones mémoire à vocation différente
         instructions du programme
         données
         pile d'exé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 d'allocation de
   mémoire dynamique
POO en C++: Mémoire Dynamique        141         © 1997-2003 Fabio HERNANDEZ
Allocation

   Les objets alloués en mémoire dynamique sont manipulés via
   des pointeurs
   La mémoire du tas n'est pas initialisée
   Exemple: allocation d'un entier
           int* intPointer = new int;

                   intPointer

                                            ??????    sizeof(int)




                                  zone de mémoire dans le tas
POO en C++: Mémoire Dynamique       142                 © 1997-2003 Fabio HERNANDEZ
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



       intPointer                                    zones déjà
                                                     allouées




                                                        tas
POO en C++: Mémoire Dynamique          143           © 1997-2003 Fabio HERNANDEZ
Allocation (suite)

   On peut aussi allouer un tableau d'objets
          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 l'allocation n'a pas pu être faite
         épuisement de la mémoire dynamique
         fragmentation du tas




POO en C++: Mémoire Dynamique          144           © 1997-2003 Fabio HERNANDEZ
Allocation (suite)

   Exemple: duplication d'une 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 C

POO en C++: Mémoire Dynamique          145                © 1997-2003 Fabio HERNANDEZ
Dé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 programme
   Les objets alloués en mémoire dynamique existent jusqu'à
   leur désallocation explicite ou jusqu'à la fin de l'exécution
   La désallocation explicite est faite en appliquant l'opérateur
   delete sur un pointeur à un objet en mémoire dynamique
                    int* intPointer = new int;
                    // use intPointer...       Désallocation
                    delete intPointer;           explicite
   Désallocation d'un tableau
                    int* intArray = new int[arrayDimension];
                    // use intArray...
                    delete [] intArray;



POO en C++: Mémoire Dynamique          146              © 1997-2003 Fabio HERNANDEZ
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 d'allocation
   L'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 const
          delete [] message;            // OK


POO en C++: Mémoire Dynamique            147            © 1997-2003 Fabio HERNANDEZ
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
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
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

Contenu connexe

Tendances

Partie 9: Fonctions Membres — Programmation orientée objet en C++
Partie 9: Fonctions Membres — Programmation orientée objet en C++Partie 9: Fonctions Membres — Programmation orientée objet en C++
Partie 9: Fonctions Membres — Programmation orientée objet en C++Fabio Hernandez
 
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++Fabio Hernandez
 
Partie 7: Evolution du Modèle Objet — Programmation orientée objet en C++
Partie 7: Evolution du Modèle Objet — Programmation orientée objet en C++Partie 7: Evolution du Modèle Objet — Programmation orientée objet en C++
Partie 7: Evolution du Modèle Objet — Programmation orientée objet en C++Fabio Hernandez
 
Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++
Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++
Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++Fabio Hernandez
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11Microsoft
 
C++11 en 12 exemples simples
C++11 en 12 exemples simplesC++11 en 12 exemples simples
C++11 en 12 exemples simplesPethrvs
 
Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références Aziz Darouichi
 
Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019Aziz Darouichi
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneMicrosoft
 
Chap1V2019: Cours en C++
Chap1V2019: Cours en C++Chap1V2019: Cours en C++
Chap1V2019: Cours en C++Aziz Darouichi
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objetsAziz Darouichi
 
Chapitre6: Surcharge des opérateurs
Chapitre6:  Surcharge des opérateursChapitre6:  Surcharge des opérateurs
Chapitre6: Surcharge des opérateursAziz Darouichi
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfacesAziz Darouichi
 
Chapitre1: Langage Python
Chapitre1: Langage PythonChapitre1: Langage Python
Chapitre1: Langage PythonAziz Darouichi
 

Tendances (20)

Partie 9: Fonctions Membres — Programmation orientée objet en C++
Partie 9: Fonctions Membres — Programmation orientée objet en C++Partie 9: Fonctions Membres — Programmation orientée objet en C++
Partie 9: Fonctions Membres — Programmation orientée objet en C++
 
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++
Partie 2: Types, Variables, Opérateurs — Programmation orientée objet en C++
 
Partie 7: Evolution du Modèle Objet — Programmation orientée objet en C++
Partie 7: Evolution du Modèle Objet — Programmation orientée objet en C++Partie 7: Evolution du Modèle Objet — Programmation orientée objet en C++
Partie 7: Evolution du Modèle Objet — Programmation orientée objet en C++
 
Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++
Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++
Partie 3: Contrôle d'Exécution — Programmation orientée objet en C++
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11
 
Chap2fonctionscpp
Chap2fonctionscppChap2fonctionscpp
Chap2fonctionscpp
 
C++11 en 12 exemples simples
C++11 en 12 exemples simplesC++11 en 12 exemples simples
C++11 en 12 exemples simples
 
Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références
 
Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019Chapitre2fonctionscppv2019
Chapitre2fonctionscppv2019
 
Chap1: Cours en C++
Chap1: Cours en C++Chap1: Cours en C++
Chap1: Cours en C++
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
 
Chap1V2019: Cours en C++
Chap1V2019: Cours en C++Chap1V2019: Cours en C++
Chap1V2019: Cours en C++
 
Polymorphisme
PolymorphismePolymorphisme
Polymorphisme
 
Ch04
Ch04Ch04
Ch04
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objets
 
Chapitre6: Surcharge des opérateurs
Chapitre6:  Surcharge des opérateursChapitre6:  Surcharge des opérateurs
Chapitre6: Surcharge des opérateurs
 
Polymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraitePolymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraite
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfaces
 
Chapitre1: Langage Python
Chapitre1: Langage PythonChapitre1: Langage Python
Chapitre1: Langage Python
 
Langage C
Langage CLangage C
Langage C
 

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

  • 1. Programmation Orientée Objet en C++ 5ème Partie: Mémoire Dynamique Fabio Hernandez Fabio.Hernandez@in2p3.fr
  • 2. Vue d'Ensemble Notions de base Types, variables, opérateurs Contrôle d'exé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/sortie POO en C++: Mémoire Dynamique 138 © 1997-2003 Fabio HERNANDEZ
  • 3. Table des Matières Motivation Environnement d'exécution Allocation Désallocation POO en C++: Mémoire Dynamique 139 © 1997-2003 Fabio HERNANDEZ
  • 4. Motivation La quantité de données à traiter dans un programme peut être inconnue à priori En plus, elle peut varier d'une exécution du programme à une autre Comment 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) POO en C++: Mémoire Dynamique 140 © 1997-2003 Fabio HERNANDEZ
  • 5. Environnement d'exécution Lors de l'exécution d'un programme, le système d'exploitation met en place son environnement Quatre zones mémoire à vocation différente instructions du programme données pile d'exé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 d'allocation de mémoire dynamique POO en C++: Mémoire Dynamique 141 © 1997-2003 Fabio HERNANDEZ
  • 6. Allocation Les objets alloués en mémoire dynamique sont manipulés via des pointeurs La mémoire du tas n'est pas initialisée Exemple: allocation d'un entier int* intPointer = new int; intPointer ?????? sizeof(int) zone de mémoire dans le tas POO en C++: Mémoire Dynamique 142 © 1997-2003 Fabio HERNANDEZ
  • 7. 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 intPointer zones déjà allouées tas POO en C++: Mémoire Dynamique 143 © 1997-2003 Fabio HERNANDEZ
  • 8. Allocation (suite) On peut aussi allouer un tableau d'objets 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 l'allocation n'a pas pu être faite épuisement de la mémoire dynamique fragmentation du tas POO en C++: Mémoire Dynamique 144 © 1997-2003 Fabio HERNANDEZ
  • 9. Allocation (suite) Exemple: duplication d'une 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 C POO en C++: Mémoire Dynamique 145 © 1997-2003 Fabio HERNANDEZ
  • 10. Dé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 programme Les objets alloués en mémoire dynamique existent jusqu'à leur désallocation explicite ou jusqu'à la fin de l'exécution La désallocation explicite est faite en appliquant l'opérateur delete sur un pointeur à un objet en mémoire dynamique int* intPointer = new int; // use intPointer... Désallocation delete intPointer; explicite Désallocation d'un tableau int* intArray = new int[arrayDimension]; // use intArray... delete [] intArray; POO en C++: Mémoire Dynamique 146 © 1997-2003 Fabio HERNANDEZ
  • 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 d'allocation L'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 const delete [] message; // OK POO en C++: Mémoire Dynamique 147 © 1997-2003 Fabio HERNANDEZ
  • 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. 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. 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