从boost::shared_ptr获取普通指针?

66

我有一个类似于 boost::shared_ptr<Type> t(makeSomething(), mem_fun(&Type::deleteMe)) 的东西。 现在我需要调用需要指向 Type 的指针的 C 样式函数。我该如何从 boost::shared_ptr 中获取它?

3个回答

160

使用get()方法:

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

确保在库函数处理完shared_ptr之前,它不会超出其作用域——否则可能会导致错误,因为在已删除指针后,库函数可能尝试对其进行操作。如果库函数在返回后仍然保留原始指针的副本,请特别小心。


你或许应该注意一下,在c_library_function对raw_foo进行操作之前,这个shared_ptr已经超出了其作用域。 - falstro
我知道那个,我只是需要了解get :)。谢谢Adam!:D - user34537
1
嗨,@Adam Rosenfield,你能解释一下在c_library_function内发生异常的情况会发生什么吗?这意味着raw_foo会被悬置吗?还是foo_ptr会继续删除raw_foo,因为raw_foofoo_ptr持有? - thassan

37

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

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

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


我比较喜欢你的回答,比亚当的略微好一点,抱歉亚当。 - user34537
4
“@acidzombie24 - 我不确定为什么你更喜欢这个。在大概99%或更多的情况下,使用Get()方法是更好的选择。” - Michael Burr
我正在使用get,但我仍然喜欢这个答案。主要是因为它建议了该做什么和不该做什么。 - user34537
22
这种方法会触发针对空指针的断言。不好。 - Drew Dormann
2
@DrewDormann在这里提出了一个很好的观点,acidzombie24。你会遇到空指针的问题。 - volpato
1
在现代C++中,&*现在属于“未定义行为”的可怕类别,不再等同于.get().get()将正确处理nullptr,正如@DrewDormann所指出的那样,但即使&*不触发断言,您的编译器也可能将其视为永远不可能为空。特别是,在许多现代编译器上,if(&*x == nullptr)将不会产生与if(x.get() == nullptr)相同的行为,后者将把前者视为始终为假! - Sean Werkema

1

对于std::shared_ptr(C++11起),也有一个get方法来获取原始指针。链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接