Un moyen efficace d'utiliser une variable ou un objet, à la fois dans le programme principal
mais aussi à l'intérieur d'une fonction, est de créer une allocation dynamique de mémoire
pour cette variable ou cet objet.
Nous utiliserons l'opérateur new pour réserver l'espace mémoire nécessaire pour
le stockage,
et ensuite l'opérateur delete pour détruire cet espace avant de quitter le programme.
Ne surtout pas oublier de détruire cet espace car même après l'arrêt du programme, cet espace reste réservé,
et n'est donc plus disponible pour le fonctionnement de l'ordinateur.
Je vous rassure, vous récupérez cet espace au redémarrage de votre machine, mais imaginez un serveur
continuellement en fonction qui utilise de façon répété un tel programme. Il finirait pas planter
pour cause de mémoire insuffisante.
Assez bavardé, découvrons maintenant comment utiliser ces nouveaux opérateurs
Supposons travailler sur des variables de type "entière", nous commençons donc par déclarer un pointeur de type entier. Une bonne habitude est d'initialiser ce pointeur à zéro.
int * monPointeur = 0;
L'allocation de la mémoire se fait ensuite de cette façon :
monPointeur = new int;
Nous venons donc de réserver un emplacement mémoire pour un entier.
Attribuons maintenant par exemple la valeur 27 à cet entier :
* monPointeur = 27;
Il est possible également de réserver un emplacement mémoire de grande taille en utilisant par exemple un tableau. Ce qui suit réserve un tableau de 200 nombres entiers.
monPointeur = new int [200];
A ne pas oublier pour éviter les fuites de mémoires !
Avant de quitter le programme, pour supprimer l'emplacement mémoire
et donc la variable que nous avons précédemment utilisée, nous écrivons :
delete monPointeur;
Pour un tableau de 10 caractères utilisant le pointeur défini précédemment, on écrira :
monPointeur = new int [10];
L'initialisation des valeurs du tableau pourrait alors se faire de la façon suivante :
for(int
i=0;
i<10;
i++)
{
monPointeur[i] =
0;
}
Notez qu'utiliser ici le symbole * du deréférencement serait une erreur.
La présence des crochets se suffit a elle même pour signifier qu'on attend une valeur et
non une adresse.
Certains programmeurs préfèrent d'ailleurs écrire
* (monPointeur + i) = 0
Avant de quitter le programme nous libérons la mémoire de cette façon :
delete [] monPointeur;
Observez la présence des crochets avant le nom du pointeur pour signifier qu'il s'agissait d'un tableau.
#include <iostream>
using namespace std;
int main()
{
int
* monPointeur =
new int [5];
for(int
i=0;
i<5;
i++)
{
monPointeur[i] =
2 *
i;
cout
<<
"monPointeur[" <<
i <<
"] = " <<
monPointeur[i]
<<
endl;
}
delete
[]
monPointeur;
return 0;
}
En une seule ligne, nous allouons un espace mémoire de 5 entiers, et nous attribuons l'adresse de ce tableau au pointeur que nous venons de créer. La boucle permet ensuite d'initialiser les valeurs de notre tableau. Ce sera ici les premiers nombres paires. La mémoire est ensuite libérée.