Destruction d'objets

De RAD Studio
Aller à : navigation, rechercher

Remonter à Modèles C++ et Pascal Objet


Deux mécanismes diffèrent dans la destruction d'objets en C++ et en Pascal Objet. Ce sont :

  • Les destructeurs appelés à cause d'exceptions déclenchées dans les constructeurs.
  • Les méthodes virtuelles appelées dans les destructeurs

Les classes de style Delphi combinent les méthodes de ces deux langages. Les sections suivantes décrivent ces points plus en détail.

Exceptions déclenchées dans les constructeurs

Les destructeurs ne sont pas appelés de la même manière en C++ et en Pascal Objet quand une exception est déclenchée pendant la construction de l'objet. Par exemple, la classe C dérive de la classe B qui dérive de la classe A :

 class   A 
 { 
 
 // body 
 } ; 
 
 class  B:  public   A 
 { 
 
 // body 
 } ; 
 
 class  C:  public   B 
 { 
 
 // body 
 } ;

Considérons le cas d'une exception déclenchée dans le constructeur de la classe B lors de la construction d'une instance de C. Le résultat obtenu dans les classes C++, Pascal Objet et de style Delphi est décrit ci-dessous :

  • En C++, les destructeurs des données membres de l'objet B complètement construites sont appelés puis le destructeur de A est appelé et enfin les destructeurs des données membres de A complètement construites sont appelés. Par contre les destructeurs de B et C ne sont pas appelés.
  • En Pascal Objet, seul le destructeur de la classe instanciée est appelé automatiquement. C'est donc le destructeur de C. Comme pour les constructeurs, c’est au programmeur d’appeler inherited dans les destructeurs. Dans cet exemple, si on suppose que tous les destructeurs appellent inherited, on a donc dans l’ordre l’appel des destructeurs de C, B et A. De plus, que le mot clé inherited soit ou non déjà appelé dans le constructeur de B avant que l’exception n’arrive, le destructeur de A est appelé car inherited a été appelé dans le destructeur de B. L’appel du destructeur de A ne dépend pas du fait que son constructeur ait ou non été appelé. De plus, comme fréquemment les constructeurs commencent par appeler inherited, le destructeur de C est appelé même si la totalité de son constructeur n’a pas été exécutée.
  • Dans les classes de style Delphi, les classes de base VCL, FireMonkey et RTL (implémentées en Pascal Objet) respectent la méthode Pascal Objet d’appel des destructeurs. Les classes dérivées (implémentées en C++) ne suivent aucune des deux méthodes précédentes. Tous les destructeurs sont appelés ; mais l’exécution ne passe pas par le corps de ceux qui n’auraient pas été appelés en appliquant les règles de langage C++.

Les classes implémentées en Pascal Objet offrent l’opportunité de mettre en oeuvre du code de nettoyage placé dans le corps du destructeur. Cela inclut le code libérant la mémoire des sous-objets (c’est-à-dire des données membres qui sont des objets) construits avant que l’exception se soit produite. Attention : pour les classes de style Delphi, le code de nettoyage peut ne pas être exécuté pour la classe instanciée ou pour ses bases implémentées en C++ même si les destructeurs sont appelés.

Méthodes virtuelles appelées dans les destructeurs

La répartition des méthodes virtuelles dans les destructeurs fonctionne comme dans les constructeurs. Cela signifie que pour les classes de style Delphi, la classe dérivée est détruite d’abord, mais le type à l’exécution de l’objet reste celui de la classe dérivée durant les appels ultérieurs aux destructeurs des classes de base. Donc, si des méthodes virtuelles sont appelées dans les destructeurs des classes de base de bibliothèques, vous répartissez potentiellement vers une classe qui s'est déjà détruite elle-même.

Voir aussi