Comment faire pour supprimer intentionnellement un boost::shared_ptr?
J'ai beaucoup de boost::shared_ptr<MyClass>
objets, et à un certain moment, j'ai volontairement voulez delete
certains d'entre eux pour libérer de la mémoire. (Je sais à ce moment que j'ai n'auront jamais besoin de la pointe-à MyClass
plus des objets.) Comment puis-je le faire?
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 suis pas sûr de la façon de l'utiliser, et aussi il est dit expérimentale juste à côté d'elle. (Je pense que j'ai Boost 1.38.)
Peut-être juste d'attribuer un nouveau vide boost::shared_ptr
à la variable? Qui devrait jeter les vieux de la valeur et de le supprimer.
- NOOOOO: N'appelez pas supprimer après un appel à get(). Le pointeur intelligent a toujours une copie et téléphoner à supprimer lors de la parution de l'objet.
Vous devez vous connecter pour publier un commentaire.
Vous venez de le faire
Voir le shared_ptr manuel. Il est équivalent à
Vous appelez
reset
sur chaque pointeur intelligent qui ne devrait pas référence à l'objet. Le dernier de cesreset
(ou toute autre action qui provoque le compte de référence tombe à zéro, en fait) fera l'objet d'être libre ed à l'aide de la deleter automatiquement.Peut-être vous êtes intéressé par le Pointeur Intelligent Techniques De Programmation. Il dispose d'une entrée sur retard de libération de la mémoire.
Si vous voulez être en mesure de faire intentionnellement supprimer les objets (je fais tout le temps) alors vous devez utiliser une propriété unique. Vous avez été attirés dans l'aide de shared_ptr quand il n'est pas approprié pour votre conception.
Le point de l'ensemble de
boost::shared_ptr<T>
est que le pointee objet sera supprimé exactement au moment où aucuneshared_ptr<T>
s point à lui -- c'est, lors de la dernièreshared_ptr<T>
pointant vers cet objet est hors de portée ou est réaffecté à point à un autre objet. Donc, tout ce que vous avez à faire pour supprimer un objet, c'est s'assurer il n'y a passhared_ptr<T>
s le pointe du doigt. E. g. si vous avez un seulshared_ptr<T>
appelép
pointant sur un objet, soit de laisser tomber hors de portée, ou appelezp.reset()
(équivalent àp = NULL
un simple pointeur), ou de céder à point à quelque chose d'autre.Si vous avez deux
shared_ptr<T>
s pointant sur l'objet, vous aurez besoin de réaffecter les deux.EDIT: Grâce à dehmann pour préciser que
p = NULL;
n'est pas en fait le code est valide pour uneshared_ptr<T>
... 🙂p = nullptr
syntaxe autorisée? il semble assez intuitif, plus quereset()
...nullptr
faisait partie du langage C++. Permettantp = nullptr
en plus semble comme il ne pouvait pas faire de mal... Mais alors beaucoup de choses semble pas le cas en C++ dans un premier temps :-/Ce que vous voulez faire est de retourner la faiblesse des références à l'aide de boost::weak qui peuvent être convertis à un shared_ptr en cas de besoin. Cela peut vous permettre de contrôler la durée de vie de l'objet dans le shared_ptr et ceux qui veulent accéder, il peut tenir sur le weak et d'essayer de convertir un shared_ptr. Si c'convertir échoue, alors ils peuvent ré-interroger et de rapporter l'objet en mémoire.