我有一个类似于 boost::shared_ptr<Type> t(makeSomething(), mem_fun(&Type::deleteMe))
的东西。
现在我需要调用需要指向 Type
的指针的 C 样式函数。我该如何从 boost::shared_ptr
中获取它?
我有一个类似于 boost::shared_ptr<Type> t(makeSomething(), mem_fun(&Type::deleteMe))
的东西。
现在我需要调用需要指向 Type
的指针的 C 样式函数。我该如何从 boost::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()
方法的其他类一起使用。例如,在通用类模板中可能会很有用。
&*
现在属于“未定义行为”的可怕类别,不再等同于.get()
。.get()
将正确处理nullptr
,正如@DrewDormann所指出的那样,但即使&*
不触发断言,您的编译器也可能将其视为永远不可能为空。特别是,在许多现代编译器上,if(&*x == nullptr)
将不会产生与if(x.get() == nullptr)
相同的行为,后者将把前者视为始终为假! - Sean Werkema
c_library_function
内发生异常的情况会发生什么吗?这意味着raw_foo
会被悬置吗?还是foo_ptr
会继续删除raw_foo
,因为raw_foo
由foo_ptr
持有? - thassan