Подтвердить что ты не робот

Получение нормального ptr из shared_ptr?

У меня есть что-то вроде shared_ptr<Type> t(makeSomething(), mem_fun(&Type::deleteMe)) Теперь мне нужно вызвать функцию стиля C, для которой требуется указатель на Type. Как получить его из shared_ptr?

4b9b3361

Ответ 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(). Может быть полезно в шаблоне универсального класса, например.