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.
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.
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!