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

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

Patricia Arquette
Libérer: 2024-12-06 06:44:12
original
280 Les gens l'ont consulté

Can `shared_ptr` Work Without Virtual Destructors in Polymorphic Classes?

Pointeurs partagés non polymorphes : dévoiler les secrets

Le débat houleux entre M. Lidström et M. Tsirunyan soulève une question fondamentale : est-ce il est possible d'implémenter shared_ptr sans imposer de destructeurs virtuels pour les polymorphes cours ?

M. L'affirmation de Lidström selon laquelle shared_ptr

Cependant, la norme C 11 et la bibliothèque Boost démontrent qu'un tel destructeur virtuel la mise en œuvre est en effet possible. Cet exploit est accompli grâce au concept d'"effacement de type" :

template<class T>
class shared_ptr
{
public:
   ...
   template<class Y>
   explicit shared_ptr(Y* p);
   ...
};</p>
<p>Dans l'exemple fourni, shared_ptr<Base><sp(new Derived);, le constructeur modélisé avec Y=Derived crée et initialise l'objet shared_ptr. Surtout, ce constructeur stocke un pointeur vers un bloc de contrôle contenant les compteurs de référence et un objet deleter spécialement conçu pour la classe Derived.</p>
<p>Lorsque le nombre de références tombe à zéro, l'objet deleter, armé de sa connaissance du La structure de la classe dérivée est invoquée pour disposer de la mémoire allouée.</p>
<p>La norme C 11 spécifie explicitement ce comportement dans les exigences du constructeur :</p>
<pre class="brush:php;toolbar:false">Requires: ... The expression delete p shall be well formed, shall have well defined behaviour and shall not throw exceptions.
Effects: Constructs a shared_ptr object that owns the pointer p.
Copier après la connexion

Cela garantit que le suppresseur est correctement invoqué et que la mémoire est libérée en toute sécurité, même si le pointeur a été converti de Derived en Base.

De même, la norme décrit le destructeur comportement :

Effects: ... Otherwise, if *this owns a pointer p, and delete p is called.
Copier après la connexion

En utilisant des constructeurs basés sur des modèles et l'effacement de type, shared_ptr peut éviter le besoin de ressources virtuelles. destructeurs dans des classes polymorphes, permettant une gestion efficace de la mémoire pour un plus large éventail de scénarios.

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