получить нормальный ptr из shared_ptr? - PullRequest
45 голосов
/ 03 февраля 2009

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

Ответы [ 2 ]

130 голосов
/ 03 февраля 2009

Используйте метод get():

boost::shared_ptr<foo> foo_ptr(new foo());
foo *raw_foo = foo_ptr.get();
c_library_function(raw_foo);

Убедитесь, что ваш shared_ptr не выходит из области видимости до того, как с ней будет работать библиотечная функция - в противном случае это может привести к ошибкам, поскольку библиотека может попытаться что-то сделать с указателем после того, как она будет удалена. Будьте особенно осторожны, если библиотечная функция поддерживает копию необработанного указателя после его возврата.

28 голосов
/ 03 февраля 2009

Другой способ сделать это - использовать комбинацию операторов & и *:

boost::shared_ptr<foo> foo_ptr(new foo());
c_library_function( &*foo_ptr);

Хотя лично я предпочел бы использовать метод get() (это действительно правильный ответ), у него есть одно преимущество: его можно использовать с другими классами, которые перегружают operator* (разыменование указателя), но не предоставить get() метод. Может быть полезным, например, в шаблоне универсального класса.

...