Module 5 : La gestion de la mémoire Flashcards
trois grandes zones de mémoire
Zone de la pile d’appel
Zone d’adressage statique
Zone d’allocation dynamique sur le monceau
Zone de la pile d’appel
permet de stocker des variables temporaires dont la durée de vie correspond à la durée de la fonction à laquelle ces variables sont associées.
ovariable locale :
apparaît au moment d’un appel de fonction
disparaît lorsque cette même fonction se termine.
La pile empile et dépile continuellement des données.
Zone d’adressage statique
permet de définir
o des variables globales,
o des variables définies hors des fonctions
o des variables déclarées comme statique.
La visibilité de ces variables dépend de leur déclaration
leur durée de vie coïncide avec le démarrage de
l’exécutable et l’arrêt de celui-ci.
- Zone d’allocation dynamique
Les deux premières zones ont leur utilité
odemeurent insuffisantes pour la plupart des programmes sérieux.
dans un programme, on ne peut
oestimer la quantité de mémoire nécessaire
oprévoir à quel moment celle-ci sera nécessaire.
oréserver une très grande partie de la mémoire
simplement parce qu’on prévoit en avoir besoin.
utiliser l’allocation dynamique pour obtenir et libérer de la mémoire lorsqu’on en a vraiment besoin.
pour allouer de la mémoire dynamiquement,
opérateur
new :
X* p = new X(arguments du constructeur);
oOn doit absolument récupérer l’espace alloué par le new
sinon on laisse ce qu’on appelle des déchets (memory leaks).
opérateur delete :
oOn récupère l’espace occupé par un objet sur le monceau
oAppel de l’opérateur delete sur le pointeur obtenu à partir d’un
new :
delete p;
zone d’allocation dynamique
zone que le système d’exploitation nous réserve.
zone toujours libérée à la fin de l’exécution du programme.
Fuite de mémoire
1 new 1 delete
Qui a la responsabilité de libérer?
Solution : les pointeurs intelligents
unique_ptr
shared_ptr
weak_ptr
unique_ptr
Un seul emplacement mémoire référencé par un seul
pointeur
shared_ptr
Un même emplacement référencé par plusieurs pointeurs
oCompteur de référence (Lorsque le dernier shared_ptr est
détruit, l’objet pointe est également détruit.)
oPas de notion de propriété
Principe de clone
/**
* \fn Entraineur ::clone () const
* \brief Méthode qui permet de faire une copie alloué sur le monceau de l’objet courant.
* \return L’adresse du clone de l’objet courant dans un pointeur. */
std::unique_ptr<Personne>
Entraineur::clone () const
{
return make_unique <Entraineur> (*this); // return new Ouvrage (*this);
}</Entraineur></Personne>
deux sortes de copie
- La copie de surface (ou shallow copy)
- La copie en profondeur (ou deep copy)
Une copie de surface (shallow copy) veut dire que la liste1 et la liste2 partagent leurs données
(deep copy)
liste2 et liste1 : parfaitement indépendantes les unes des autres.
o La modification sur la liste1 n’affectera en rien le comportement de la liste2
Si on ne fait rien de particulier
le langage C++ fait toujours une copie de surface lors de la copie d’un objet.
Si on désire une copie en profondeur
il faut l’implanter.
Constructeur copie
oAppelé si passage en paramètre par valeur
oAppelé si retour par valeur
o automatiquement généré par le langage C++
fait une copie de surface par défaut
Opérateur de copie/assignation
=
o automatiquement généré par le langage C++
fait une copie de surface par défaut
Pour toute classe qui contient des allocations dynamique de la mémoire,
implanter les 3 méthodes
Destructeur (vider): avec les pointeurs intelligents on a plus besoin de destructeurs.
constructeur de copie (remplir)
surcharge de operator = (vider puis remplir)