Destructeurs virtuels purs en C
Dans le monde de la programmation orientée objet, les classes de base abstraites nécessitent souvent des destructeurs virtuels purs. Cependant, des problèmes surviennent lors de l'écriture de code comme celui-ci :
class A { public: virtual ~A() = 0; };
Cela soulève la question de savoir s'il est acceptable qu'une classe de base abstraite ait un destructeur purement virtuel. Alors que Microsoft Visual C le compile sans problème, que se passe-t-il au moment de l'exécution ?
La réponse est : comportement non défini. Si une instance d'une classe dérivée de A est supprimée ou détruite, le destructeur de A sera invoqué. Cependant, comme il est purement virtuel et qu’il manque une implémentation, cela déclenche un comportement indéfini. Sur certaines plateformes, cela peut entraîner l'invocation du gestionnaire purecall, entraînant un crash.
Pour éviter cela, il est crucial d'implémenter également le destructeur. Une implémentation minimale comme celle-ci devrait suffire :
class A { public: virtual ~A() = 0; }; inline A::~A() { }
De cette façon, lorsque les instances de classes dérivées sont supprimées, le destructeur de A ne provoquera pas de comportement indéfini.
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!