C++ 从shared_ptr 得到一个普通的ptr?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/505143/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
getting a normal ptr from shared_ptr?
提问by Adam Rosenfield
I have something like shared_ptr<Type> t(makeSomething(), mem_fun(&Type::deleteMe))
I now need to call C styled function that requires a pointer to Type
. How do I get it from shared_ptr
?
我有类似的东西,shared_ptr<Type> t(makeSomething(), mem_fun(&Type::deleteMe))
我现在需要调用需要指向Type
. 我如何获得它shared_ptr
?
回答by Adam Rosenfield
Use the get()
method:
使用get()
方法:
boost::shared_ptr<foo> foo_ptr(new foo());
foo *raw_foo = foo_ptr.get();
c_library_function(raw_foo);
Make sure that your shared_ptr
doesn't go out of scope before the library function is done with it -- otherwise badness could result, since the library may try to do something with the pointer after it's been deleted. Be especially careful if the library function maintains a copy of the raw pointer after it returns.
确保shared_ptr
在库函数完成之前您没有超出范围 - 否则可能会导致糟糕的结果,因为库可能会在指针被删除后尝试对其进行处理。如果库函数在返回后维护原始指针的副本,则要特别小心。
回答by Michael Burr
Another way to do it would be to use a combination of the &
and *
operators:
另一种方法是使用&
和*
运算符的组合:
boost::shared_ptr<foo> foo_ptr(new foo());
c_library_function( &*foo_ptr);
While personally I'd prefer to use the get()
method (it's really the right answer), one advantage that this has is that it can be used with other classes that overload operator*
(pointer dereference), but do not provide a get()
method. Might be useful in generic class template, for example.
虽然我个人更喜欢使用该get()
方法(它确实是正确的答案),但它的一个优点是它可以与重载operator*
(指针取消引用)但不提供get()
方法的其他类一起使用。例如,在泛型类模板中可能很有用。