Programmation/Programmation orientée objet/Instanciation

L'instanciation d'une classe c'est créer un objet ayant pour modèle la classe concernée. Cette opération est assimilable à l'allocation d'une variable (objet) d'un certain type (classe).

Une instance (aussi appelée objet) est le résultat de l'instanciation (création d'un objet de la classe voulue).

Allocation statique

modifier

Il est possible d'allouer un objet de manière statique (zone des variables statiques). L'objet est alors libéré automatiquement (sortie de programme pour une instance globale, sortie de fonction pour une instance locale à la fonction, ...). Certains langages (tel Java) n'autorisent pas ce genre d'allocation.

L'allocation statique à l'intérieur d'une fonction crée un objet local alloué dans la même zone mémoire que les variables locales : la pile. La pile ayant une taille limitée, il n'est pas recommandé d'allouer statiquement de grands objets. De la même manière, il n'est pas recommandé d'appeler une fonction allouant un objet de taille moyenne de manière récursive sur une grande profondeur, car la quantité allouée grimpe rapidement, pouvant provoquer un débordement de pile.

Pour résoudre ce problème, au lieu de la solution limitée d'augmenter la taille de la pile, il est préférable dans ce cas d'allouer les objets de manière dynamique, sur le tas, la zone mémoire dédiée.

Allocation dynamique

modifier

Il est également possible d'allouer un objet dynamiquement en utilisant explicitement une instruction d'allocation (généralement un opérateur nommé new). L'objet doit être libéré explicitement (C++), ou il peut être libéré automatiquement par un ramasse-miettes (Java, C#). Un ramasse-miettes s'occupe de libérer les espaces de mémoire qui ne sont plus référencés, et se déroule en général de façon asynchrone (la libération n'est pas immédiate).

Cycle de vie

modifier

Une fois l'espace mémoire alloué à un objet, les champs de celui-ci sont initialisés par le constructeur invoqué lors de l'instanciation. Un constructeur est une méthode spéciale qui ne retourne rien. En Java, C++ et C#, le constructeur des instances d'une classe doit porter le même nom que la classe.

Après utilisation de l'objet, la zone mémoire qu'il occupe doit être libérée afin de pouvoir allouer d'autres objets. Un objet alloué statiquement est désalloué automatiquement à la sortie du contexte de son allocation (programme, fonction ou bloc de code local). Un objet alloué dynamiquement doit être libéré de manière explicite :

  • Les langages sans ramasse-miettes (C++, C sharp en mode unsafe par exemple) ont une instruction pour libérer la mémoire allouée. Avant la libération effective, le destructeur de l'objet est appelé afin de libérer également les ressources internes prises par l'objet.
  • Les langages avec ramasse-miettes (Java, C sharp) ne permettent pas une libération immédiate. Il faut supprimer la référence à l'objet en lui assignant la référence nulle. C'est le ramasse-miette qui gère toutes les références aux objets : quand un objet n'a plus de référence, il est libérable. Cela signifie que l'objet ne sera pas libéré immédiatement, mais lors de l'exécution du ramasse-miettes ou en cas de manque de mémoire pour allouer un objet.