Maison > développement back-end > C++ > Un destructeur virtuel pur en C devrait-il être implémenté ?

Un destructeur virtuel pur en C devrait-il être implémenté ?

Susan Sarandon
Libérer: 2024-12-23 15:56:11
original
331 Les gens l'ont consulté

Should a Pure Virtual Destructor in C   Be Implemented?

Destructeur virtuel pur en C : une mise en garde

Lors de la définition d'une classe de base abstraite en C, il peut être tentant de déclarer un destructeur virtuel comme purement virtuel, comme montré dans l'extrait de code ci-dessous :

class A {
public:
    virtual ~A() = 0;
};
Copier après la connexion

Bien que cette syntaxe soit valide dans certains compilateurs, tels que MSVC, elle présente un danger caché qui peut entraîner des plantages d'exécution.

Le problème : implémentation manquante du destructeur

Le problème avec le code ci-dessus est que le destructeur virtuel est déclaré pur sans fournir d'implémentation. Cela signifie que le comportement du destructeur est délégué à des classes dérivées concrètes. Cependant, si un objet de type A lui-même est détruit, son destructeur sera appelé et son manque d'implémentation entraînera un comportement indéfini.

Conséquences potentielles

Dans un scénario typique, dériver de la classe de base abstraite A et tenter de détruire un objet de la classe dérivée invoquera finalement le destructeur de A. Sans implémentation, cela peut déclencher un comportement indéfini sur certaines plateformes, comme l'appel du gestionnaire purecall et le crash du programme.

La solution : implémenter le destructeur

Pour résoudre ce problème, la base abstraite le destructeur de classe doit être implémenté explicitement, même si son corps est vide. L'extrait de code corrigé ci-dessous démontre ceci :

class A {
public:
    virtual ~A() = 0;
};

inline A::~A() { }
Copier après la connexion

En fournissant une implémentation vide pour le destructeur de A, vous vous assurez que son comportement est défini lorsqu'il est appelé directement ou via des classes dérivées.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal