Maison >développement back-end >C++ >`shared_ptr` peut-il fonctionner correctement sans destructeurs virtuels dans les classes polymorphes ?
Dans notre débat, nous avons remis en question la nécessité d'exiger que les classes polymorphes aient des destructeurs virtuels pour l'implémentation de shared_ptr. L'argument présenté affirmait que shared_ptr pouvait fonctionner correctement sans cette exigence.
Approfondissons la mise en œuvre de shared_ptr pour déterminer la validité de cette affirmation.
Effacement de type et constructeur de modèles
shared_ptr utilise l'effacement de type pour stocker un suppresseur dans le même bloc mémoire que ses compteurs de référence. Le type de ce suppresseur ne fait pas partie du type shared_ptr. En employant un constructeur basé sur un modèle, shared_ptr peut prendre en charge différents types de suppresseurs en fonction de la classe spécifique gérée.
Le constructeur suivant peut être défini pour gérer cela :
template<class T> class shared_ptr { public: ... template<class Y> explicit shared_ptr(Y* p); ... };
Lors de l'utilisation de ce constructeur avec les classes Base et Derived, le suppresseur approprié peut être créé et stocké. Ce suppresseur sera invoqué lorsque le compteur de référence tombe à zéro, garantissant ainsi l'élimination correcte des objets.
Exigences de la norme C 11
La norme C 11 exige explicitement ce comportement pour le constructeur modèle :
"Effets : construit un objet shared_ptr qui possède le pointeur p."
Cela confirme que shared_ptr assume la propriété du pointeur transmis et est responsable de sa destruction.
Fonctionnalité du destructeur
Le comportement du destructeur est défini comme suit :
"Effets : Si celui-ci possède un objet p et un deleter d, d(p) est appelé. Sinon, si this possède un pointeur p, et delete p est appelé."
Cela indique que if shared_ptr gère directement un pointeur (c'est-à-dire sans suppresseur explicite). ), la suppression du destructeur par défaut est utilisée pour éliminer le object.
Conclusion
Sur la base de ces directives, il est évident que shared_ptr peut être implémenté sans exiger que les classes polymorphes aient des destructeurs virtuels. Les techniques susmentionnées, telles que l'effacement de type et le constructeur basé sur un modèle, permettent à shared_ptr de gérer efficacement les objets de tout type, y compris ceux qui ne prennent pas en charge le polymorphisme.
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!