У меня есть что-то вроде shared_ptr<Type> t(makeSomething(), mem_fun(&Type::deleteMe))
Теперь мне нужно вызвать функцию стиля C, для которой требуется указатель на Type
. Как получить его из shared_ptr
?
Получение нормального ptr из shared_ptr?
Ответ 1
Используйте метод get()
:
boost::shared_ptr<foo> foo_ptr(new foo());
foo *raw_foo = foo_ptr.get();
c_library_function(raw_foo);
Убедитесь, что ваш shared_ptr
не выходит из области действия до того, как функция библиотеки будет выполнена с ним, иначе может возникнуть плохое поведение, поскольку библиотека может попытаться что-то сделать с указателем после его удаления. Будьте особенно осторожны, если функция библиотеки сохраняет копию необработанного указателя после его возврата.
Ответ 2
Другой способ сделать это - использовать комбинацию операторов &
и *
:
boost::shared_ptr<foo> foo_ptr(new foo());
c_library_function( &*foo_ptr);
В то время как лично я предпочел бы использовать метод get()
(это действительно правильный ответ), одно из преимуществ этого заключается в том, что его можно использовать с другими классами, которые перегружают operator*
(разыменование указателя), но делают не предоставлять метод get()
. Может быть полезно в шаблоне универсального класса, например.