45 votes

Comment supprimer intentionnellement un boost::shared_ptr ?

J'ai beaucoup boost::shared_ptr<MyClass> objets, et à un moment donné, je veux intentionnellement delete certains d'entre eux pour libérer de la mémoire. (Je sais à ce moment-là que je n'aurai jamais besoin de l'objet pointé. MyClass plus d'objets). Comment puis-je faire ?

Je suppose que tu ne peux pas juste appeler delete() avec le pointeur brut que j'obtiens avec get() .

J'ai vu une fonction get_deleter(shared_ptr<T> const & p) en boost::shared_ptr mais je ne suis pas sûr de savoir comment l'utiliser, et il est aussi dit que expérimental juste à côté. (Je pense que j'ai Boost 1.38.)

EDITAR: Peut-être qu'il suffit d'attribuer un nouveau vide boost::shared_ptr à la variable ? Cela devrait jeter l'ancienne valeur et la supprimer.

82voto

Johannes Schaub - litb Points 256113

Tu fais juste

ptr.reset();

Voir le manuel shared_ptr . Il est équivalent à

shared_ptr<T>().swap(ptr)

Vous appelez reset sur chaque pointeur intelligent qui ne doit plus référencer l'objet. Le dernier de ces reset (ou toute autre action qui fait que le nombre de références tombe à zéro, en fait) fera que l'objet sera libéré en utilisant le suppresseur automatiquement.

Vous êtes peut-être intéressé par le Techniques de programmation des pointeurs intelligents . Il y a une entrée sur désaffectation tardive .

9voto

John Morrison Points 287

Si vous voulez être en mesure de supprimer intentionnellement des objets (ce que je fais tout le temps), vous devez utiliser la propriété unique. Vous avez été attiré par l'utilisation de shared_ptr alors que ce n'est pas approprié à votre conception.

8voto

j_random_hacker Points 28473

Le but de boost::shared_ptr<T> est que l'objet pointé sera supprimé exactement au moment où aucun shared_ptr<T> s point à elle - c'est-à-dire, lorsque le dernier shared_ptr<T> pointant vers cet objet sort de la portée ou est réaffecté pour pointer vers un objet différent. Donc, tout ce que vous avez à faire pour supprimer un objet est de vous assurer qu'il n'y a pas d'objet de type shared_ptr<T> pointant vers lui. Par exemple, si vous n'avez qu'une seule shared_ptr<T> appelé p pointant sur un objet, soit le laisser tomber hors de la portée, soit appeler p.reset() (équivalent à p = NULL pour un simple pointeur), ou l'assigner pour pointer vers autre chose.

Si vous avez deux shared_ptr<T> pointant vers l'objet, vous devrez réaffecter les deux.

EDITAR: Merci à dehmann d'avoir signalé que p = NULL; n'est pas réellement un code valide pour un shared_ptr<T> ... :)

4voto

chrish Points 1208

Ce que vous voulez faire, c'est renvoyer des références faibles à l'aide de la fonction boost::weak_ptr qui peut être converti en un shared_ptr lorsque nécessaire. Cela vous permet de contrôler la durée de vie de l'objet dans le shared_ptr et ceux qui veulent y accéder peuvent s'accrocher au weak_ptr et essayer de le convertir en shared_ptr. Si cette conversion échoue, ils peuvent alors réinterroger et ramener l'objet en mémoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X