Maison >développement back-end >C++ >En quoi les destructeurs multiples dans GNU GCC (g ) diffèrent-ils et pourquoi sont-ils générés ?

En quoi les destructeurs multiples dans GNU GCC (g ) diffèrent-ils et pourquoi sont-ils générés ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-24 03:43:02184parcourir

How Do Multiple Destructors in GNU GCC (g  ) Differ and Why Are They Generated?

Destructeurs multiples dans GNU GCC (g )

Question :

Lors de l'enquête sur la couverture du code dans GNU GCC (g ), plusieurs destructeurs ont été observés pour BaseClass et DerivedClass. Pourquoi ces multiples destructeurs sont-ils générés et en quoi diffèrent-ils ?

Réponse :

Dans l'ABI Itanium C, trois types de destructeurs sont définis :

  • D2 (destructeur d'objet de base) : Détruit l'objet lui-même, les classes de base non virtuelles et les membres de données.
  • D1 (destructeur d'objet complet) : Détruit l'objet, y compris les classes de base virtuelles.
  • D0 (suppression du destructeur d'objet) : Détruit l'objet, appelle l'opérateur de suppression pour libérer de la mémoire.

Destructeurs multiples dans le code donné :

Le code donné génère plusieurs destructeurs car il inclut des classes de base virtuelles. Dans ce cas :

  • DerivedClass::~DerivedClass() est le destructeur D1, qui détruit l'objet DerivedClass et sa classe de base virtuelle (BaseClass).
  • DerivedClass::~DerivedClass () est le destructeur D2, qui détruit uniquement l'objet DerivedClass, à l'exclusion de la classe de base virtuelle.
  • BaseClass::~BaseClass() est le destructeur D1 du sous-objet BaseClass dans DerivedClass.

Utilisation sélective des destructeurs :

L'ABI Itanium C spécifie quel destructeur est exécuté :

  • Suppression d'un pointeur vers une classe de base (par exemple, delete b_ptr) invoque D0 (par défaut) ou D1 (si la classe a un destructeur virtuel).
  • La suppression d'un pointeur vers un pointeur d'objet complet (par exemple, DerivedClass* dptr) invoque D1.

Implications sur la couverture :

Pour atteindre une couverture de fonctions à 100 %, il est important de comprendre ces destructeurs et de les invoquer en conséquence dans les tests unitaires. Par exemple, b_ptr doit être supprimé en tant que BaseClass* b_ptr pour exécuter D0 et couvrir les deux destructeurs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn