Comment supprimer intentionnellement un boost :: shared_ptr?
-
05-07-2019 - |
Question
J'ai plusieurs boost::shared_ptr<MyClass>
objets et, à un moment donné, je souhaite volontairement delete
en libérer certains d'entre eux. (Je sais à ce stade que je n'aurai plus jamais besoin des MyClass
objets pointés). Comment puis-je faire cela?
Je suppose que vous ne pouvez pas simplement appeler delete()
avec le pointeur brut que je reçois avec get()
.
J'ai vu une fonction get_deleter(shared_ptr<T> const & p)
dans boost::shared_ptr
, mais je ne sais pas comment l'utiliser, et il est également indiqué expérimental juste à côté. (Je pense avoir Boost 1,38.)
Peut-être simplement assigner un nouveau <=> vide à la variable? Cela devrait jeter l'ancienne valeur et la supprimer.
La solution
vous venez de faire
ptr.reset();
Voir le le manuel shared_ptr . C'est équivalent à
shared_ptr<T>().swap(ptr)
Vous appelez reset
sur chaque pointeur intelligent qui ne devrait plus faire référence à l'objet. Cette dernière <=> (ou toute autre action entraînant la remise à zéro du compte de références) entraînera la libération automatique de l'objet à l'aide du suppresseur.
Peut-être êtes-vous intéressé par les Techniques de programmation de pointeur intelligent . Il contient une entrée sur la désallocation retardée .
Autres conseils
Si vous voulez pouvoir supprimer intentionnellement des objets (je le fais tout le temps), vous devez utiliser la propriété unique. Vous avez été amené à utiliser shared_ptr lorsque cela ne correspond pas à votre conception.
L’intérêt de boost::shared_ptr<T>
est que l’objet pointee sera supprimé exactement au moment où aucun shared_ptr<T>
ne le pointera - c’est-à-dire lorsque le dernier p
pointant lorsque cet objet sort de la portée ou est réaffecté pour pointer vers un autre objet. Donc, tout ce que vous avez à faire pour supprimer un objet est de vous assurer qu'il n'y a pas p.reset()
de pointeur. Par exemple. si vous ne possédez qu'un seul p = NULL
appelé p = NULL;
pointant sur un objet, laissez-le tomber en dehors de la portée ou appelez <=> (équivalent à <=> pour un pointeur normal) ou affectez-le à un point sinon.
Si vous avez deux <=> points pointant vers l'objet, vous devez les réaffecter tous les deux.
MODIFIER: Merci à dehmann d'avoir signalé que <=> n'est pas un code valide pour un <=> ...:)
.Ce que vous voulez faire, c'est retourner des références faibles en utilisant boost :: faible_ptr pouvant être converti en un shared_ptr si nécessaire. Cela peut vous permettre de contrôler la durée de vie de l'objet dans le shared_ptr et que ceux qui le souhaitent peuvent conserver le faible et essayer de convertir en shared_ptr. Si cette conversion échoue, ils peuvent alors interroger à nouveau et ramener l'objet en mémoire.