Maison > développement back-end > C++ > `shared_ptr` peut-il fonctionner correctement sans destructeurs virtuels dans les classes polymorphes ?

`shared_ptr` peut-il fonctionner correctement sans destructeurs virtuels dans les classes polymorphes ?

Susan Sarandon
Libérer: 2024-12-08 13:50:10
original
725 Les gens l'ont consulté

Can `shared_ptr` Function Correctly Without Virtual Destructors in Polymorphic Classes?

Implémentation de shared_ptr sans destructeurs virtuels

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);
   ...
};
Copier après la connexion

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!

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