2009-02-02 7 views

ответ

123

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

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

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

+0

Вы должны, возможно, отметить что-то о том, что shared_ptr выходит из области действия до того, как c_library_function выполнил свою работу с raw_foo. – falstro

+0

roe: Я знаю об этом, мне просто нужно знать о получении :). Спасибо Адаму! : D – 2009-02-02 22:07:34

+1

Привет @Adam Rosenfield, не могли бы вы объяснить, что происходит в сценарии, где исключение происходит внутри 'c_library_function'. Это означает, что raw_foo остается болтающимся? или foo_ptr идет вперед и удаляет raw_foo, так как raw_foo удерживается foo_ptr? – thassan

27

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

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

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

+0

Мне понравился ваш ответ чуть больше, чем Адамс, извините адам. – 2009-02-02 23:50:21

+3

@ acidzombie24 - Я не уверен, почему вам это нравится. Метод Get() лучше использовать, вероятно, в 99% или более случаях. –

+0

Я использую get, но мне все еще нравится этот ответ. в основном bc рекомендует как делать, так и НЕ делать. – 2009-02-03 17:43:49

 Смежные вопросы

  • Нет связанных вопросов^_^