Download ÉDITION

Transcript
É L É M E N T S
D U
L A N G A G E
C + +
1.17 ALLOCATION DYNAMIQUE
L’environnement d’exécution C++ (runtime environment) met à la disposition des
programmes une zone de mémoire libre (free store) pour l’entreposage des données.
La réclamation de cette zone libre est réalisée par l’allocation dynamique de la
mémoire. C’est-à-dire, la réservation de la mémoire lorsque le programme est en
exécution. L’allocation dynamique de la mémoire implique nécessairement
l’utilisation des pointeurs. Le mot clé new sert à allouer une partie de cette zone libre
tandis que le mot clé delete permet le retour de la mémoire allouée au système.
Dans l’exemple de la sous-section précédente, les algorithmes exigent comme
paramètres d’entrée :
void QSort(int* iVec, int low, int high);
un vecteur et deux scalaires (des entiers). Le vecteur peut être alloué statiquement
par :
int vecEntier[10];
ou alloué dynamiquement par :
int *vecEntier = new int[10];
Le point à remarquer est que l’allocation statique est réalisée lors de la compilation
du programme. Alors que l’allocation dynamique est effectuée lors de l’exécution du
programme. Ainsi, l’allocation statique demande une expression constante intégrale
(constante entière) entre les crochets. Cette restriction n’est pas appliquée dans le cas
d’une allocation dynamique10. Dans l’exemple ci-dessous, la ligne 7 produira une
erreur de compilation. On ne peut pas utiliser une expression non constante (i*2)
entre les crochets d’une allocation statique. Par contre, la ligne 8 est parfaitement
légale puisqu’il s’agit d’une allocation dynamique.
1. const int DIM = 10;
2.
3. void main()
4. {
5. int i = 5;
6. int iVec[DIM];
7. int *iVec2[i*2];
8. int *iVec3 = new int[i*2];
9.
// ok
// Non ! Expr. constante seulement
// ok
10. for (i=0; i<DIM; i++) {
11. iVec[i] = i*DIM;
12. iVec3[i] = i;
13. }
14. delete [] iVec3;
15. }
10
Évidemment, l’expression entre crochets doit évaluée à un type intégral (entier).
27