У меня есть что-то вроде shared_ptr<Type> t(makeSomething(), mem_fun(&Type::deleteMe))
Теперь мне нужно вызвать функцию стиля C, для которой требуется указатель на Type
. Как мне получить его от shared_ptr
?Получение нормального ptr из shared_ptr?
ответ
Используйте get()
метод:
boost::shared_ptr<foo> foo_ptr(new foo());
foo *raw_foo = foo_ptr.get();
c_library_function(raw_foo);
Убедитесь, что ваш shared_ptr
не выходит за рамки, прежде чем функция библиотеки осуществляется с ним - в противном случае вредность может привести, так как библиотека может попытаться сделать что-то с указателем после его удаления. Будьте особенно внимательны, если функция библиотеки сохраняет копию необработанного указателя после его возврата.
Другой способ сделать это было бы использовать комбинацию операторов &
и *
:
boost::shared_ptr<foo> foo_ptr(new foo());
c_library_function(&*foo_ptr);
Хотя лично я предпочел бы использовать метод get()
(это действительно правильный ответ), одно преимущество что он может быть использован с другими классами, которые перегружают operator*
(разыменование указателя), но не предоставляют метод get()
. Может быть полезно, например, в шаблоне универсального класса.
Мне понравился ваш ответ чуть больше, чем Адамс, извините адам. – 2009-02-02 23:50:21
@ acidzombie24 - Я не уверен, почему вам это нравится. Метод Get() лучше использовать, вероятно, в 99% или более случаях. –
Я использую get, но мне все еще нравится этот ответ. в основном bc рекомендует как делать, так и НЕ делать. – 2009-02-03 17:43:49
Вы должны, возможно, отметить что-то о том, что shared_ptr выходит из области действия до того, как c_library_function выполнил свою работу с raw_foo. – falstro
roe: Я знаю об этом, мне просто нужно знать о получении :). Спасибо Адаму! : D – 2009-02-02 22:07:34
Привет @Adam Rosenfield, не могли бы вы объяснить, что происходит в сценарии, где исключение происходит внутри 'c_library_function'. Это означает, что raw_foo остается болтающимся? или foo_ptr идет вперед и удаляет raw_foo, так как raw_foo удерживается foo_ptr? – thassan