Ce que le C++ Pointeur Intelligent Implémentations sont disponibles?

Les comparaisons, les avantages, les Inconvénients, et Quand les Utiliser?

C'est un spin-off à partir d'un la collecte des ordures fil où ce que je pensais était une simple réponse a généré beaucoup de commentaires au sujet de certains de pointeur intelligent implémentations il m'a donc semblé intéressant de commencer un nouveau post.

En fin de compte, la question est de savoir quelles sont les différentes implémentations de smart pointeurs en C++ là-bas et comment se comparent-ils? De simples avantages et des inconvénients ou des exceptions et de pièges à quelque chose que vous pourriez penser devrait fonctionner.

J'ai posté quelques implémentations que j'ai utilisé ou au moins dissimulés et a envisagé d'utiliser comme une réponse ci-dessous et de ma compréhension de leurs différences et les similitudes qui peuvent ne pas être précis à 100%, donc n'hésitez pas à la vérité ou me corriger au besoin.

L'objectif est de découvrir de nouveaux objets et des bibliothèques ou de corriger mon utilisation et la compréhension des implémentations existantes déjà largement en usage et à la fin de jouir d'un niveau de référence pour les autres.

  • Je pense que cela devrait être ré-affiché comme une réponse à cette question, et la question d'une réelle question. Sinon, je sens les gens vont fermer ce que n'est pas "une vraie question".
  • Il y a toutes sortes d'autres pointeurs intelligents, par exemple ATL smart pointeurs ou OpenSceneGraph est osg::ref_ptr.
  • Est-il question ici?
  • "QObject et les classes dérivées, qui dans le framework Qt est tout" - pas tout à fait vrai. Qt a beaucoup de classes qui ne découle pas de QObject. La plupart d'entre eux sont implicitement partagé et rarement alloués sur le tas, si. Des exemples sont QString et QDom* les classes.
  • Je pense que vous avez mal compris std::auto_ptr. std::auto_ptr_ref est un détail de conception de std::auto_ptr. std::auto_ptr n'a rien à voir avec la collecte des ordures, c'est le principal objectif est précisément de permettre à l'exception sûr transfert de propriété, en particulier dans la fonction d'appel et de retour de la fonction des situations. std::unique_ptr ne peut résoudre les "problèmes" que vous citez avec des conteneurs standard parce que le C++ a changé pour permettre une distinction entre les déplacer et copier et conteneurs standards ont changé pour profiter de cette.
  • Il est très probable l'utilisation prévue de std::auto_ptr n'était pas vraiment comme un pointeur intelligent qui pourrait expliquer la non-copiable la nature et le transfert de propriété lors de l'affectation. Je pense peut-être à l'échelle de l'abus et l'idée fausse de son usage prévu en partie conduit à la modification proposée.
  • Dans ce cas, quelle est votre définition de "pointeur intelligent"?
  • Il s'agit d'un auto-destruction du pointeur.
  • Il serait quelque chose le long des lignes de "un objet qui encapsule et contient un pointeur brut aux fins de la gestion de l'allocation et la désallocation de la mémoire en toute sécurité" ... j'ai édité avec un texte de présentation et un lien vers un article que j'ai lu lorsque l'on cherche précisément pourquoi std::auto_ptr ne pouvait pas être utilisé en toute sécurité dans certains cas.
  • Par définition, pas beaucoup de votre cité objets sont des pointeurs intelligents que quelques-uns d'entre eux de gérer l'allocation. - Je censé shared_ptr compte car make_shared est une partie de son interface, mais votre définition semble plus proche de ce que j'appellerais un "pimpl" classe.
  • Vous dites que vous n'êtes pas un expert dans les pointeurs intelligents, mais que votre résumé est assez exhaustive et correcte (sauf pour les mineurs ergoter sur auto_ptr_ref être un détail de l'implémentation). Encore, je suis d'accord que vous devez poster cela comme une réponse et de reformuler la question à une question réelle. Cela peut alors servir de référence future.
  • Je suppose que votre droit, si vous voulez être argumenté que la définition n'était pas le même reset() méthodes n'appelez pas new pour vous si je dois supprimer "affectation et" ... même si je suis sûr que quelqu'un a probablement mis en place quelque chose comme ça avant.
  • Ma définition de pointeur intelligent est probablement beaucoup plus ample que la vôtre, alors. Je considère auto_ptr être un pointeur intelligent donc, quand vous avez dit que "l'utilisation prévue de std::auto_ptr n'était pas vraiment comme un pointeur intelligent" je voulais juste préciser exactement ce que vous voulez dire par un pointeur intelligent. Je ne cherche pas à être pointilleux ou argumentatif, juste effacer.
  • Vote pour l'ouvrir. La question est clairement indiqué: "en fin de compte, la question est de savoir quelles sont les différentes implémentations de smart pointeurs en C++ là-bas et comment se comparent-ils?". AINSI a été conçu pour permettre l'auto-répond à des questions au bénéfice de la communauté. De discuter du fond, les forces et les faiblesses des différents pointeurs sera utile aux gens, ce qui est le but ultime.
  • A l'origine, il était dans la question, je n'ai pas réussi à modifier la structure actuelle assez vite 😉
  • malheureusement, c'est l'un des principaux problèmes que j'ai avec. Les Questions sont voté fermé trop vite, surtout quand il ya une réelle possibilité de récupérer assez facilement.
  • C'était impressionnant de 5 minutes de marge, mais je ne peux pas me plaindre. Une très grande attention aux détails les plus infimes est à la fois une bonne et une mauvaise caractéristique de programmeurs.
  • d'accord, mais à une tentative de refactoring doit être faite avant de jeter un morceau de code =P
  • "Les comparaisons, les avantages, les Inconvénients, et Quand les Utiliser?" genre de question conduit à toutes sortes de subjectif des réponses (en plus c'est un auto répondu à la question...) je pense vraiment que ce devrait être la reformuler dans quelque chose comme "Qui sont les Pointeurs Intelligents implémentations en C++?" et chacun doit être dans un coin de la réponse.
  • A voté pour le ré-ouvrir, maintenant que ceci est une vraie question. Ce pourrait même être la peine de marquage comme c++-faq. Je le ferais moi-même, mais je ne suis pas sûr de les 5 balises à remplacer. @Josh: Même si des questions peuvent être fermées rapidement, comme vous l'avez remarqué, ils peuvent aussi être ré-ouvert. Pas de réel problème ici. La question a été modifié pour être une réelle question, et il est maintenant possible d'y répondre. Ainsi, il a été ré-ouvert.
  • J'ai édité la question. Je vais laisser ma réponse que c'est parce qu'il semble excessif de poster une auto-réponse pour chaque mise en œuvre.
  • Accepter puisque personne d'autre ne semble avoir d'autres implémentations d'ajouter ou de corrections.
  • Ajouté c++-faq tag, et a supprimé les c++-11, comme il est en train de devenir le nouveau c++ bientôt... je l'espère.
  • Connexes: qu'est Ce qu'un pointeur intelligent et quand dois-je utiliser?

InformationsquelleAutor AJG85 | 2011-02-17