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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top