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; };
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 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.
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.
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() { }
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!