46 votes

boost, partagé ptr vs faible ptr? Lequel utiliser quand?

J'utilise le pointeur partagé boost depuis un temps considérable dans mon projet.

Récemment, mes coéquipiers ont également commencé à utiliser des indicateurs faibles. Je ne suis pas capable de distinguer lequel utiliser quand.

En dehors de cela, que dois-je faire si je veux convertir un ptr faible en un ptr partagé? Le fait de verrouiller ptr faible pour créer un ptr partagé affecte-t-il mon code dans un autre thread?

71voto

Narfanator Points 1550

En général et sommaire,

De fortes présomptions de garantir leur propre validité. Utiliser, par exemple, lorsque:

  • Vous possédez de l'objet pointé; vous de le créer et de le détruire
  • Vous n'avez pas défini de comportement si l'objet n'existe pas
  • Vous devez vous assurer que l'objet existe.

Des pointeurs faibles garantie connaître leur propre validité. Utiliser, par exemple, lorsque:

  • D'accès, mais ce n'est pas la vôtre.
  • Vous avez défini le comportement si l'objet n'existe pas

Lock() sur un faible pointeur retourne une forte pointeur; c'est la façon dont vous accédez à la faiblesse du pointeur. Si l'objet n'est plus valide (il a été supprimé, etc), puis la forte pointeur est NULL, sinon, ce sera le point de l'objet. Vous aurez besoin de vérifier cela.

Il est configuré de cette manière, de sorte que vous ne pouvez pas supprimer accidentellement l'objet pendant que vous l'utilisez, car vous avez fait une temporaire (local) forte de pointeur, et donc garantie l'existence de l'objet tandis que la forte pointeur reste. Lorsque vous avez fini d'utiliser l'objet, vous devez généralement laisser la forte pointeur de tomber hors de la portée (ou à la réaffectation des il), ce qui permet alors à la suppression de l'objet. Pour le multithreading, les traiter avec le même soin que vous traiter d'autres choses qui n'ont pas intégré dans le thread de sécurité, notant que la garantie je l'ai mentionné ci-dessus sera prise quand le multithreading. Autant que je sache, ils ne font rien de spécial passé.

Le coup de pouce partagé pointeurs ont également garbage collector comme caractéristiques, depuis quand la dernière forte pointeur vers un objet disparaît ou les points d'ailleurs, l'objet est supprimé.

Il y a aussi les performances et les dépendances circulaires mentionnées dans les autres réponses.

Fondamentalement, je dirais que le coup de pouce pointeur partagé bibliothèque vous permet de ne pas gâcher en mettant sur pied un programme, mais il n'est pas un substitut pour prendre le temps de bien concevoir votre pointeurs, l'objet de la propriété et de la durée de vie. Si vous avez une telle conception, vous pouvez utiliser la bibliothèque de la faire respecter. Si vous ne disposez pas d'une telle conception, vous êtes confronté à différents problèmes qu'avant.

23voto

blwy10 Points 2858

Utilisation weak lorsque les objets que vous créez contenir des références cycliques, c'est à dire shared_ptr à un objet avec un shared_ptr de retour pour vous. C'est parce que shared_ptr ne peut pas gérer cyclique références - quand les deux objets hors de portée, la mutuelle de référencement signifie qu'ils ne sont pas des "ordures", de sorte que la perte de la mémoire et que vous avez une fuite de mémoire. Depuis weak de ne pas augmenter le nombre de références, le cyclique de référence de problème ne se produit pas. Cela signifie également que, en général, si vous voulez juste prendre un pointeur vers quelque chose de référence compté et ne veulent pas augmenter son compteur de référence, puis utilisez weak.

Sinon, vous pouvez utiliser shared_ptr.

Pour plus d'informations, consultez le coup de pouce de la documentation.

7voto

Antti Huima Points 15465

Partagé pointeurs en œuvre de comptage de référence, la faiblesse des pointeurs n'affectent pas de comptage de référence et si vous n'avez pas partagé des pointeurs vers un objet, seulement des pointeurs faibles, l'objet est supprimé et la faiblesse des pointeurs maintenant vous dire que l'objet a été perdu.

Il y a deux raisons de l'utilisation d'une faible pointeur:

  1. Pour éliminer les coûts de comptage de référence augmenter / diminuer; toutefois, vous ne devriez pas faire cela parce qu'il est enclin à l'erreur et n'a pas vraiment d'économiser beaucoup de temps
  2. Dans la comptabilité des structures de données, par exemple, vous avez un index de tous les objets de Foo qui sont "vivants", c'est à dire quelque part, et vous ne voulez pas garder un Foo vivant dans l'index si tous les "vrais" utilise de l'avoir terminé. C'est la base réaliste de cas d'utilisation pour des pointeurs faibles. Bien sûr, les autres existent aussi.

Donc, en général, ma recommandation serait d'utiliser des pointeurs faibles seulement quand vous savez que vous voulez laisser les objets référencés être supprimé et voulez détecter que. Dans d'autres cas, l'utilisation partagée des pointeurs (comptage de référence), ou de diriger des pointeurs, esp. dans la méthode des variables locales lorsque vous savez que les objets ne sont pas va être supprimé. Également susceptible de causer des erreurs, mais, mais plus vite que les pointeurs partagés.

N. B. cyclique des objets n'ont pas besoin des pointeurs faibles, vous pouvez utiliser non cuite, régulièrement des pointeurs plutôt que dans la plupart des construit correctement des programmes. Des pointeurs faibles, moins risquée, cependant.

-10voto

Vous ne devriez probablement pas essayer d'utiliser des pointeurs faibles du tout, sauf si vous essayez d'implémenter un ramasse-miettes, ce qui n'est pas une idée brûlante en C ++, car il est trop difficile de suivre de près tout ce qui pourrait mal se passer.

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