• Aucun résultat trouvé

La gestion dynamique de la mémoire

N/A
N/A
Protected

Academic year: 2022

Partager "La gestion dynamique de la mémoire"

Copied!
5
0
0

Texte intégral

(1)

1

Programmation avancée en C++

„

La gestion dynamique de la mémoire

„

La généricité (patrons)

„

Les exceptions

2

„ L’allocation dynamique de mémoire concerne toutes les allocations de mémoire

„ réalisées de manière explicite par le programmeur au cours de l’exécution d’un programme.

„ Cette allocation peut être faite pour tous les types prédéfinis ou non, utilisables dans une application :

„ Types de base : entier, réel, …

„ Tableaux : tableaux d’entiers, de réels, …

„ Chaînes de caractères,

„ Classes …

3

La gestion dynamique de la mémoire

„ Elle permet de mettre en oeuvre des structures dynamiques

„ listes, piles, files, arbres, graphes …

„ En C++, il existe deux opérateurs d’allocation :

„ new [] pour l’allocation de tableaux,

„ new pour les autres types

„ et un opérateur d’allocation

„ delete

„ Il existe aussi d’autres opérateurs d’allocation issus du C :

„ malloc, calloc, realloc … et de désallocation free.3

4

La gestion dynamique de la mémoire L'opérateur d'allocation new

„ La forme simplifiée est la suivante :

„ new <arguments> type <initialisateur>

„ L’opérateur new comporte toujours au moins un paramètre qui est le type de l’objet alloué.

„ Ce type permet au compilateur de connaître la taille de l’objet à allouer.

„ Deux autres informations peuvent être données lors de l’utilisation de l’opérateur new.

5

La gestion dynamique de la mémoire L'opérateur d'allocation new

„ Ces informations sont liées :

„ d’une part à l'utilisation des constructeurs

„ d’autre part à la possibilité de surcharger l’opérateur new

„ comme tout autre opérateur du langage

„ et d’avoir des paramètres définis dans le cadre de cette surcharge.

6

La gestion dynamique de la mémoire L'opérateur d'allocation new

„ Allocation d’un objet d’un type de base : int *pi; // pi est un pointeur sur entier pi= new int; // allocation d’espace pour un entier

„ Allocation d’un objet d’une classe class complexe

{ float r, i;

public : complexe(void);

complexe (float, float); …….} ;

(2)

7

La gestion dynamique de la mémoire L'opérateur d'allocation new

„

La déclaration d’un pointeur sur complexe et l’allocation dynamique de ce complexe peut s’écrire de la façon suivante :

„

complexe *pc;

„

pc= new complexe;

„

Un objet de type complexe est créé/alloué et l’appel du constructeur (ici par défaut est réalisé).

8

La gestion dynamique de la mémoire L'opérateur d'allocation new

„

L’appel du constructeur avec paramètres peut être explicitement fait en donnant lors de l’utilisation de l’opérateur new .

„

complexe *pc;

„

pc = new complexe (1.0, 1.0);

„appel du constructeur avec paramètre d’un complexe

9

La gestion dynamique de la mémoire L'opérateur d'allocation new

„

Allocation d’un objet d’un type de base avec appel du constructeur avec paramètre

„

On peut créer dynamiquement un entier (ou un réel) en lui affectant une valeur par appel du constructeur adéquat.

„

int *pi;

„

pi= new int (0);

10

La gestion dynamique de la mémoire L'opérateur d'allocation new []

„ Cet opérateur fonctionne comme l’opérateur new

„ mais il doit être utilisé dans le cadre de l’allocation de tableaux.

„ Allocation de chaînes de caractères

„ Une chaîne peut être allouée de façon statique :

„ char s[80] ;

„ réservation de 80 octets dans une zone pointée par s,

„ variable allouée dans la zone de données principale ou la pile selon si la variable est globale ou locale (ou static).

11

La gestion dynamique de la mémoire L'opérateur d'allocation new []

„

Une chaîne peut être allouée dynamiquement

„soit à un nombre constant d’octets,

„soit par une taille variable.

„

char *s ;

„déclaration d’un pointeur sur un caractère (char *s)

„

s = new char [80];

„réservation de 80 octets (s = new char [80];)

12

La gestion dynamique de la mémoire L'opérateur d'allocation new []

char s1[MAX], *s2;

int l;

strcpy(s1,”exemple”);

l=strlen(s1);

s2= new char [l+1];

„

allocation statique de s1 à MAX caractères,

„

allocation dynamique de s2 sur une zone de 8

octets

(3)

13

L'opérateur d'allocation new []

„ Allocation des tableaux d’entiers, de réels ou autres

„ Allocation d’un tableau d’ entiers int *tab ;

tab = new int [10];

„ Allocation d’un tableau de complexe complexe *tab ;

int nb=5;

tab = new complexe [nb];

14

L'opérateur d'allocation new []

„ Allocation de tableaux à plusieurs dimensions

„ tabch = new char [10] [80];

„ tableau de 10 chaînes de 80 caractères

„ tabch[i] désigne la i+1 ème chaîne que l’on peut manipuler comme une chaîne :

„ exemple strcpy(tabch[i], "bonjour");

„ matrice de nblig x nbcol éléments

„ int **mat;int nblig, nbcol;

mat = new int *[nblig];

for (int i=0; i<nlig; i++) mat[i] = new int [nbcol];

15

La gestion dynamique de la mémoire Surcharge des opérateurs new et new []

„ L’opérateur new peut aussi avoir des : “arguments”

„ Ils sont utilisés lorsque l’opérateur new a été surchargé

„ et nécessite le passage en paramètres d’arguments spécifiques.

„ En tant qu’opérateurs, new ou new [] (pour les tableaux) peuvent être surchargés : les formes générales surchargées à utiliser sont :

void * operator new (size_t, liste des arguments) void * operator new [] (size_t, liste des arguments)

„ où size_t est équivalent à « unsigned int » et contient le nombre d’octets à allouer

„ et liste des arguments est la liste des paramètres de l’opérateur new ainsi surchargé.

16

La gestion dynamique de la mémoire Surcharge des opérateurs new et new []

„ Exemple :

„ Dans le cadre d'une application de gestion d'une

bibliothèque, deux classes "CDescriptif" et "CBiblio" ont été définies.

„ La classe "CDescriptif " comporte le descriptif d'un livre

„ nom d'auteur, titre, thème, code etc…

„ et un code bibliothèque, fixe pour tous les livres d'une même bibliothèque.

„ Ce champs s'appelle "nom" dans l'exemple.

„ Cette classe possède un constructeur avec paramètre qui permet d'initialiser le nom de la bibliothèque du livre.

17

La gestion dynamique de la mémoire Surcharge des opérateurs new et new []

class CDescriptif { char nom[80];

……

public : descriptif (void);

descriptif(char *pnom);

...

};

descriptif :: descriptif (char *pnom) { strcpy(nom,pnom); }

18

La gestion dynamique de la mémoire Surcharge des opérateurs new et new []

„

La bibliothèque comporte au maximum 100 livres.

„

La classe "CBiblio" est composée d'un tableau de 100 pointeurs sur des descriptifs de livres.

„

On souhaite surcharger l'opérateur new pour la classe "CBiblio" pour lui permettre

„ d'allouer dynamiquement les 100 descriptifs de livres

„ avec une initialisation des noms de bibliothèques à une valeur passée en paramètre à l'opérateur new de

"biblio".

(4)

19

La gestion dynamique de la mémoire Surcharge des opérateurs new et new []

class CBiblio { descriptif *tpd[100];

public : biblio(void);

void *operator new (size_t, char *);

...

};

„ Le corps de l'opérateur new surchargé doit réaliser les opérations suivantes :

„ allocation d'un objet de type biblio

„ allocation des objets de type descriptif avec appels du constructeur avec paramètres

20

La gestion dynamique de la mémoire Surcharge des opérateurs new et new []

„ void * biblio :: operator new (size_t, char *pnom)

{ // déclaration d'une variable locale de type biblio biblio *pbb;

// allocation de cet objet de type biblio par l'opérateur global new pbb = :: newbiblio ;

// construction des objets du tableau for(int=0;i<100;i++)

pbb->tpd[i] = new descriptif (pnom);

// retour de l'objet construit return pbb;

}

21

La gestion dynamique de la mémoire Surcharge des opérateurs new et new []

void main(void) { biblio *pb;

char *valeur=“Biblio de l'université”;

// appel du constructeur surchargé de la classe biblio pb = new (valeur) biblio;

….

}

22

La gestion dynamique de la mémoire L'opérateur de désallocation delete

„ delete expression (pour les non tableaux)

„ delete [ ] expression (pour les tableaux)

„ Désallocation des tableaux int *tab;

tab = new int [10];

delete [ ] tab;

„ Désallocation d’un autre objet complexe *c;

c= new complexe;

delete c;

23

La gestion dynamique de la mémoire Allocation dynamique

Constructeur et destructeur

„

Le constructeur est appelé automatiquement lors de la déclaration d'un objet de la classe.

„

Le destructeur est est appelée à chaque fois qu'une variable est désallouée.

„

Un destructeur peut être utile lorsque

„le constructeur d'une classe effectue une allocation

„qui doit être libérée en même temps que la désallocation de la variable.

24

La gestion dynamique de la mémoire Allocation dynamique

Constructeur et destructeur

Exemple : class p_complexe {private :

complexe *pc;

public :

p_complexe(void); // constructeur

~p_complexe(void); // destructeur };

p_complexe :: p_complexe(void) { pc = new complexe; …}

p_complexe :: ~p_complexe(void) { delete pc; …}

(5)

25

Conclusion

„

Les opérateurs d'allocation et de désallocation

„Permettent la gestion dynamique de la mémoire

„Peuvent être surchargés

„

Il n'y a pas de mécanisme de ramasse-miettes comme en java,

„La désalloction est à la charge du programmeur.

26

La gestion dynamique de la mémoire

„

Exemple

„ On définit une classe abstraite CPile avec les fonctionnalités classiques

„Empiler, dépiler, sommet, estvide

„ On implémente cette classe en utilisant une liste simplement chaînée pour la pile

„Empiler = ajout en tête

„Dépiler = suppression en tête

„Estvide = test si la liste est vide

„ sommet = donne la valeur de l'élément en tête de liste

Références

Documents relatifs

Elle est d’autant plus importante que la masse de la charge est grande et s’oppose à la mise en mouvement. Elle est caractérisée par le moment d’inertie J, qui s’exprime en

Exercice 4 : La combustion complète de 0.35 g d’un composé A de formule brute C x H y a donné 0,45 g d’eau. Déduire celui du carbone.. 2/ a- Sachant que la masse molaire de A est

 Le deuxième objectif de cette RDP est de déterminer la surface de panneaux photovoltaïques que doit comporter un satellite pour assurer son bon fonctionnement et la

Si l'on en croit Jesse Fox, auteur principal d'une étude et professeur assistante en communication à l'Université de l'Ohio, les hommes qui publient beaucoup de selfies sur

Les élèves ne disposant pour l’instant que d’informations qualitatives sur l’énergie potentielle et l’énergie cinétique d’un système, le but de

marge brute – remise – prix d’achat net – prix de vente hors taxe – coût d’achat prix de vente toute taxe comprise – prix d’achat net – frais d’achat – prix

Mise en valeur du travail de création : Ronsard au gré des poèmes associe le mythe de Méduse à un autre mythe, complète et dépasse le mythe en attribuant à

Le soumissionnaire remet, comme pièce constitutive de son offre, un document par lequel il marque son engagement à mettre en œuvre