Mandragor


Allocation dynamique en C++

Le pourquoi de l'allocation dynamique.

Dans les premiers langages comme le Basic, l'Ada, on ne trouvait pas de système d'allocation dynamique. Lors de l'écriture du programme, on savait pertinemment combien d'espace memoire serait reservé par le programme. Cela donnait des effets des plus negligés, on n'avait jamais plus de 3 ennemis dans l'ecran et on ne pouvait avoir pas plus de 40 unités de combat...

Il vient alors l'idée de chercher comment on pourrait faire pour ne plus avoir cette restriction. Il est alors apparu qu'il fallait que le programme réserve l'espace dont il avait besoin de façon dynamique. C'est en ça que consiste l'allocation dynamique de mémoire, il s'agit de créer les objets, les valeurs lorsque l'on en a besoin.

Le Comment de l'allocation dynamique

En C++, pour créer des objets de façon dynamique, nous allons utiliser un nouvel operateur du C++ qui est l'operateur new. Cet operateur crée un objet en mémoire et renvoie un pointeur vers l'adresse de cet objet. Nous ferons donc :

  Voiture *Point=new Voiture(/*ici on met les parametre a passer au constructeur*/);

Vous pouvez remarquer que l'objet n'a pas de nom mais seulement une adresse stockée dans Point. Ceci représente une très bonne raison de ne pas perdre cette adresse. A partir de là, l'objet est créé dynamiquement en mémoire, et ne sera donc pas détruit à moins que ce ne soit demandé explicitement par l'opérateur delete.

Nous devrons donc faire: delete (point);

Si Point vaut NULL, alors le programme va générer une erreur, car les premiers octet de la mémoire sont remplis par des variables du système d'exploitation, et ne peuvent donc pas être utilisés dans un programme (heureusement d'ailleurs!). Il faut donc tester avant chaque delete que le pointeur n'est pas NULL.

Il est de bon goût de toujours initialiser ses pointeur avec NULL, sinon la valeur du pointeur pourrait etre "quelconque" et donc vous pourriez tenter de detruire n'importe quoi, ce qui pourrait avoir des conséquences catastrophiques.

Création de tableaux dynamiques

La création dynamique est extrêmement utile lors de la creation de tableaux dynamiques. Eh oui, car grâce aux tableaux dynamiques, le tableau peut avoir la taille que l'on veut, et ce au moment de l'exécution du programme, ce qui présente énormement d'avantages. On utilise également l'opérateur new pour la création, mais on utilisera delete[] pour la destruction. Prenons donc un exemple:

  int *tab=new int[8]; // défini un tableau dynamique.
  delete[] tab;

Il est également possible de définir un tableau de pointeurs vers un objet et de faire ainsi un deuxième type de tableau dynamique.

Un tableau dynamique d'objets sans faire un tableau de pointeurs est également faisable.

Utilisation de malloc

Il est déconseillé d'utiliser un malloc lorsque l'on utilise des classes alors qu'on le faisait avec les structures, car un malloc ne va pas créer un objet: il va juste réserver assez d'espace mémoire pour l'objet et ne procédera donc pas à l'appel du constructeur. Sur le même principe, lorsque l'on fera un free, il n'y aura pas d'appel au destructeur de réalisé...