2009-02-02 7 views
40

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

123

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.

+0

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

+0

roe: je sais à ce sujet, je devais juste savoir à propos de get :). Merci Adam! : D –

+1

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

27

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.

+0

J'ai aimé votre réponse juste un peu plus qu'Adams, désolé adam. –

+3

@ 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. –

+0

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. –

Questions connexes