web-dev-qa-db-fra.com

obtenir un ptr normal de shared_ptr?

J'ai quelque chose comme shared_ptr<Type> t(makeSomething(), mem_fun(&Type::deleteMe)) J'ai maintenant besoin d'appeler une fonction de style C qui nécessite un pointeur sur Type. Comment l'obtenir auprès de shared_ptr?

46
user34537

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 sort pas de la portée avant que la fonction de bibliothèque ne soit finie - sinon cela pourrait entraîner des problèmes, car la bibliothèque peut essayer de faire quelque chose avec le pointeur après sa suppression. Soyez particulièrement prudent si la fonction de bibliothèque conserve une copie du pointeur brut après son retour.

132
Adam Rosenfield

Une autre façon de le faire serait d'utiliser une combinaison des opérateurs & Et *:

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), cela a l'avantage d'être utilisable avec d'autres classes qui surchargent operator* (Déréférencement de pointeurs ), mais ne fournissez pas de méthode get(). Peut être utile dans un modèle de classe générique, par exemple.

30
Michael Burr