从shared_ptr获得正常的ptr?

47 c++ boost smart-pointers shared-ptr

我有类似于shared_ptr<Type> t(makeSomething(), mem_fun(&Type::deleteMe)) 我现在需要调用需要指针的C样式函数Type.我怎样才能得到它shared_ptr

Ada*_*eld 133

使用get()方法:

boost::shared_ptr<foo> foo_ptr(new foo());
foo *raw_foo = foo_ptr.get();
c_library_function(raw_foo);
Run Code Online (Sandbox Code Playgroud)

shared_ptr在库函数完成之前确保你的范围没有超出范围 - 否则可能导致不良,因为库可能会在删除指针后尝试对指针执行某些操作.如果库函数在返回后保留原始指针的副本,请特别小心.


Mic*_*urr 30

另一种方法是使用&*运算符的组合:

boost::shared_ptr<foo> foo_ptr(new foo());
c_library_function( &*foo_ptr);
Run Code Online (Sandbox Code Playgroud)

虽然我个人更喜欢使用这种get()方法(它确实是正确的答案),但它的一个优点是它可以与其他重载operator*(指针取消引用)的类一起使用,但不提供get()方法.例如,可能在泛型类模板中很有用.

  • 该方法将触发NULL指针的断言.不好. (19认同)
  • @ acidzombie24 - 我不确定你为什么这么喜欢这个.Get()方法最好在99%或更多的情况下使用. (4认同)
  • @DrewDormann 在这里提出了一个很好的观点,acidzombie24。你会遇到空指针的问题。 (2认同)