29 votes

Stratégies de pointeur intelligent C ++11

Si je comprends bien, dans la spécification actuelle de C++11, il faut utiliser:

  • std::unique_ptr<> pour un propriétaire (la plupart du temps)
  • std::shared_ptr<> seulement lorsqu'il y a plusieurs propriétaires dans la structure acyclique
  • std::weak_ptr<> avec parcimonie, uniquement quand il y a des cycles qui ont besoin d'être cassé
  • Un pointeur brut comme une poignée de mémoire (pas de droit de propriété) lorsqu'une référence ne suffirait pas

Donc mes questions sont:

  1. Ces politiques sont-elles suffisantes ou il y en a d'autres politiques Je devrais être au courant?
  2. Sont - scoped_ptr<> et auto_ptr<> efficacement obsolète?

32voto

Nicol Bolas Points 133791

Sont scoped_ptr<> et auto_ptr<> effectivement obsolète?

auto_ptr est déconseillée en C++11, donc il n'y est une réponse. scoped_ptr n'existe pas en C++11 et ne l'a jamais fait. La principale raison de l'utilisation boost::scoped_ptr est de s'assurer que la propriété n'est jamais transféré (à moins que vous tentez de tricher, bien sûr). Et puis, si vous utilisez unique_ptr, la propriété ne peut être transférée si vous utilisez std::move ou d'autres constructions similaires. Ou, comme Howard points, il suffit de faire un const std::unique_ptr.

Donc, c'est vraiment à vous de décider si vous voulez un peu plus d'assurance. Aussi boost::scoped_ptr n'ont pas deleter soutien. Donc, unique_ptr pouvez jouer des tours qu' boost::scoped_ptr ne le peuvent pas.

std::weak<> avec parcimonie, uniquement quand il y a des cycles qui ont besoin d'être cassé

Je ne peux pas dire que je suis d'accord avec cette politique, nécessairement. Un weak_ptr doit être utilisé lorsqu'un objet voudrez peut-être parler d'autre chose, mais elle n'est pas propre qu'autre chose. Ce qui signifie qu'il peut être supprimé à tout moment, et le titulaire de l' weak_ptr doit être capable de gérer cette suppression à tout moment, il essaie de parler.

Briser le cycle est l'un des usages de l' weak_ptr; il ne devrait pas être la seule fois qu'il est utilisé.

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