J'ai quelque chose comme shared_ptr<Type> t(makeSomething(), mem_fun(&Type::deleteMe))
Je dois maintenant appeler la fonction de style C qui nécessite un pointeur vers Type
. Comment l'obtenir de shared_ptr
?obtenir un ptr normal de shared_ptr?
Répondre
Utilisez la méthode get()
:
boost::shared_ptr<foo> foo_ptr(new foo());
foo *raw_foo = foo_ptr.get();
c_library_function(raw_foo);
Assurez-vous que votre shared_ptr
ne va pas hors de portée avant que la fonction de la bibliothèque se fait avec elle - sinon badness pourrait se produire, car la bibliothèque peut essayer de faire quelque chose avec le pointeur après qu'il a été supprimé. Soyez particulièrement prudent si la fonction de bibliothèque conserve une copie du pointeur brut après son retour.
Une autre façon de le faire serait d'utiliser une combinaison des &
et *
opérateurs:
boost::shared_ptr<foo> foo_ptr(new foo());
c_library_function(&*foo_ptr);
Bien que personnellement, je préfère utiliser la méthode get()
(c'est vraiment la bonne réponse), l'un des avantages cela a pour cela qu'il peut être utilisé avec d'autres classes qui surchargent operator*
(pointeur dereference), mais ne fournissent pas une méthode get()
. Peut être utile dans un modèle de classe générique, par exemple.
J'ai aimé votre réponse juste un peu plus qu'Adams, désolé adam. –
@ acidzombie24 - Je ne sais pas pourquoi tu aimes mieux ça. La méthode Get() est préférable d'utiliser dans probablement 99% ou plus des cas. –
J'utilise get mais j'aime toujours cette réponse. la plupart du temps il recommande à la fois ce qu'il faut faire et ne pas faire. –
- 1. Pourquoi shared_ptr a un constructeur explicite
- 2. dword confusion d'utilisation ptr
- 3. shared_ptr dans std :: tr1
- 4. Collection spécialisée pour shared_ptr
- 5. static_cast avec boost :: shared_ptr?
- 6. QList and shared_ptr
- 7. conversion de collation normal?
- 8. C++ fopen retourne un fichier * avec <bad ptr>
- 9. A quoi sert shared_ptr de boost (shared_ptr <Y> const & r, T * p)?
- 10. Comment écrire un Tilde normal (~) en C#?
- 11. Comment faire pour supprimer intentionnellement un boost :: shared_ptr?
- 12. Comment devriez-vous retourner * ceci avec un shared_ptr?
- 13. erreur de liaison ptr non paresseux - la solution
- 14. Comment mettre un contrôle normal dans un NSView?
- 15. Les suppressions dans les relations un-à-un? Comportement normal?
- 16. construire deux objets shared_ptr du même pointeur
- 17. Flash au-dessus de HTML normal
- 18. vecteur normal du moins plan carrés dérivés
- 19. Comment faire pour valider LPVOID à <Bad Ptr>
- 20. Utilisation de boost :: shared_ptr dans l'interface publique d'une bibliothèque
- 21. Combiner des servlets et un serveur web "normal"
- 22. Conversion d'une chaîne codée Html à un « normal » Url
- 23. Confondu par gdb print ptr contre l'impression "% s"
- 24. Différences entre SQL Plus et SQL "normal"?
- 25. Comportement UIButton étrange: Est-ce normal?
- 26. Recherche dans: normal vim commande misbehaves
- 27. Comment ajouter un caractère mnémotechnique à un bouton normal dans Flex? (Besoin de raccourcis)
- 28. auto_ptr ou shared_ptr équivalent dans les classes C++/CLI gérées
- 29. compte ftp distant mais avec mon nom de domaine normal
- 30. Nouveau sur Rails, ce type de performance est-il normal?
Vous devriez peut-être noter quelque chose à propos de la sortie du scope_ptr hors de portée avant que la fonction c_library_function n'ait fait son truc avec raw_foo. – falstro
roe: je sais à ce sujet, je devais juste savoir à propos de get :). Merci Adam! : D –
Salut @Adam Rosenfield, pourriez-vous expliquer ce qui se passe dans un scénario où une exception se produit dans 'c_library_function'. Cela signifie que le fichier raw_foo est laissé en suspens? Ou est-ce que foo_ptr va de l'avant et supprime le raw_foo, puisque raw_foo est tenu par foo_ptr? – thassan