Sie sind auf Seite 1von 14

Programmation Oriente Objet en C++

5me Partie: Mmoire Dynamique

Fabio Hernandez
Fabio.Hernandez@in2p3.fr

Vue d'Ensemble
}
}
}
}
}
}
}
}
}
}
}
}
}
}

Notions de base
Types, variables, oprateurs
Contrle d'excution
Fonctions
Mmoire dynamique
Qualit du logiciel
Evolution du modle objet
Objets et classes
Fonctions membres
Classes gnriques
Hritage
Polymorphisme
Hritage multiple
Entre/sortie

POO en C++: Mmoire Dynamique

138

1997-2003 Fabio HERNANDEZ

Table des Matires


}
}
}
}

Motivation
Environnement d'excution
Allocation
Dsallocation

POO en C++: Mmoire Dynamique

139

1997-2003 Fabio HERNANDEZ

Motivation
}

La quantit de donnes traiter dans un programme peut tre


inconnue priori
En plus, elle peut varier d'une excution du programme une
autre
Comment faire pour rserver la mmoire ncessaire pour
stocker ces donnes pendant l'excution du programme, si au
moment de la compilation cette quantit est inconnue?
C++ fournit une mthode d'allocation de mmoire en temps
d'excution du programme: mmoire dynamique, par opposition
la mmoire statique (alloue en temps de compilation)

POO en C++: Mmoire Dynamique

140

1997-2003 Fabio HERNANDEZ

Environnement d'excution
}

Lors de l'excution d'un programme, le systme d'exploitation


met en place son environnement
Quatre zones mmoire vocation diffrente

instructions du programme
donnes
pile d'excution (stack)
tas (heap)

Les variables globales et les variables dfinies static sont


stockes dans la zone de donnes
La pile est utilise pour stocker les paramtres, les variables
locales, les adresses et valeur de retour des fonctions
Le tas est rserv pour satisfaire les demandes d'allocation de
mmoire dynamique

POO en C++: Mmoire Dynamique

141

1997-2003 Fabio HERNANDEZ

Allocation
}

}
}

Les objets allous en mmoire dynamique sont manipuls via


des pointeurs
La mmoire du tas n'est pas initialise
Exemple: allocation d'un entier
int* intPointer = new int;
intPointer
??????

sizeof(int)

zone de mmoire dans le tas


POO en C++: Mmoire Dynamique

142

1997-2003 Fabio HERNANDEZ

Allocation (suite)
}

Un objet en mmoire dynamique est allou en appliquant


l'oprateur new sur un type (ou classe) pralablement dfini(e)
new retourne un pointeur l'objet

zones dj
alloues

intPointer

tas
POO en C++: Mmoire 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 zro si l'allocation n'a pas pu tre faite

puisement de la mmoire dynamique


fragmentation du tas

POO en C++: Mmoire Dynamique

144

1997-2003 Fabio HERNANDEZ

Allocation (suite)
}

Exemple: duplication d'une chane de caractres

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 bibliotque
standard du C

POO en C++: Mmoire Dynamique

145

1997-2003 Fabio HERNANDEZ

Dsallocation
}

A la fin de l'excution le systme d'exploitation rcupre


toutes les zones mmoire de l'environnement du programme
Les objets allous en mmoire dynamique existent jusqu'
leur dsallocation explicite ou jusqu' la fin de l'excution
La dsallocation explicite est faite en appliquant l'oprateur
delete sur un pointeur un objet en mmoire dynamique
int* intPointer = new int;
// use intPointer...
Dsallocation
delete intPointer;
explicite

Dsallocation d'un tableau

int* intArray = new int[arrayDimension];


// use intArray...
delete [] intArray;

POO en C++: Mmoire Dynamique

146

1997-2003 Fabio HERNANDEZ

Dsallocation (suite)
}

La mmoire libre par delete peut tre rutilise par le


systme pour satisfaire une demande ultrieure d'allocation
L'oprateur delete ne peut tre appliqu qu'aux pointeurs
aux objets allous via new
const int MaxLength = 255;
char* message = new char[MaxLength];
// use "message" here
const char* aPointer = message;
// use "aPointer" here
delete [] aPointer;
delete [] message;

POO en C++: Mmoire Dynamique

// ERROR: aPointer is const


// OK
147

1997-2003 Fabio HERNANDEZ

Dsallocation (suite)
}

Les zones mmoires non libres explicitement sont connues


comme les fuites de mmoire (memory leak)
int* intPointer = new int;
*intPointer = 139;
cout << "*intPointer is " << *intPointer << endl;
intPointer
139

zones
dj
alloues

intPointer = new int; // WARNING: memory leak !!!

POO en C++: Mmoire Dynamique

148

1997-2003 Fabio HERNANDEZ

Dsallocation (suite)
}

fuites de mmoire (suite)


intPointer

139

zones
dj
alloues

???

POO en C++: Mmoire Dynamique

149

1997-2003 Fabio HERNANDEZ

Dsallocation (suite)
}

Exemple: allocation de mmoire 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++: Mmoire Dynamique

150

1997-2003 Fabio HERNANDEZ

Das könnte Ihnen auch gefallen