
En C++ les variables peuvent être allouées de deux façons différentes :
Le compromis entre les deux méthodes d'allocation mémoire est l'efficacité contre la flexibilité :
Toutes les déclarations réalisées jusqu'à présent étaient essentiellement pour des variables statiques. Les deux premières différences entre allocations de mémoire statique et dynamique sont les suivantes :
Il faut donc utiliser les pointeurs pour gérer l'allocation dynamique puisque l'accès se fait de façon indirecte. Jusqu'à présent, les pointeurs étaient essentiellement utilisés pour se connecter indirectement sur une autre variable statique et éventuellement pour naviguer au travers de celle-ci ( grâce à l'arithmétique des pointeurs ) si cette dernière représente un tableau.

L'opérateur new s'occupe de l'allocation dynamique. Pour qu'il soit à même de réserver un emplacement suffisant, il faut lui indiquer le type correspondant. Le type indiqué avec l'opérateur new doit être de même nature que le type géré par le pointeur. La syntaxe générale sur l'opérateur new est donc la suivante :



A partir de nos connaissances actuelles, il n'est pas possible d'initialiser explicitement des types définis par l'utilisateur comme les structures, les énumérations et les unions. Il sera nécessaire de connaître la notion de constructeur.
En fait, il n'y a pas de remarque particulière sauf qu'il faut se souvenir qu'une variable dynamique est anonyme, et donc que la seule possibilté de l'atteindre est d'utiliser systématiquement le pointeur associé.
Souvenez-vous que pour les variables statiques, lorsque nous déclarions un pointeur, il référençait une autre variable statique. Il était alors possible, soit d'utiliser directement la variable pointée, soit indirectement par le pointeur. Dans le cas d'une variable dynamique, la question ne se pose pas, nous sommes systématiquement obligés d'utiliser le pointeur.
L'opérateur new permet également de déclarer des variables tableaux dynamiques d'un type quelconque. Malheureusement, il n'existe aucun moyen de spécifier individuellement une valeur initiale explicite pour chaque élément du tableau. La syntaxe générale est la suivante :
Type *pointeur = new Type [ n ] ;
Cette instruction alloue alors l'emplacement nécessaire pour n éléments du type spécifié ; si l'opération réussit (suffisamment de mémoire), elle fournit alors au pointeur l'adresse du premier élément de ce tableau. n désigne une expression entière quelconque (pas spécialement constante) non négative.

Il est impératif de libérer la mémoire lorsque nous avons fini de nous servir d'une variable dynamique. Sinon, tout le principe que nous venons d'évoquer ne servirait absolument à rien. La mémoire libérée peut servir ensuite pour les autres variables dynamiques. Ainsi, il est possible, avec peu de mémoire, d'utiliser énormément de variables différentes. Par ailleurs, n'oubliez pas que pour un système multitâche, les autres applications ont besoin elles-mêmes de mémoires pour fonctionner, la mémoire étant partagée pour tous les processus.
Pour libérer une mémoire allouée dynamiquement, il suffit d'utiliser l'opérateur delete. Toutefois, cet opérateur a besoin de connaître l'emplacement de la mémoire à libérer. Comme elle est anonyme, encore une fois, il est nécessaire de passer par le pointeur. Pour libérer un tableau, il suffit de placer les crochets à côté de l'opérateur delete sans précision de la dimension.
int *pint = new int ;
Personne *pPersonne = new Personne ;
…
delete pint ;
delete pPersonne ;

int *pTabInt = new int[27] ;
Personne * pTabPersonne = new Personne[124] ;
…
delete [ ] pTabInt ;
delete [ ] pTabPersonne ;
Le terme statique employé dans ce cours fait opposition au terme dynamique. Il ne s'agit en aucun cas des zones mémoires dédiées. Il existe en effet trois zones de mémoire prévues pour l'ensemble des variables utilisées dans un programme :
Les variables statiques évoquées dans ce cours concerne aussi bien la zone statique que la pile, alors que les variables dynamiques sont créées uniquement dans le tas. Ces sujets seront évoqués ultérieurement lorsque nous connaîtrons plus particulièrement les fonctions.
Pour en savoir plus sur les zones de mémoire