如何将对象实例转换为shared_ptr实例

时间:2012-10-29 04:09:18

标签: c++ boost shared-ptr

假设我有两个shared_ptr类型,例如

boost::shared_ptr<ObjA> sptrA;
boost::shared_ptr<ObjB> sptrB;

现在假设sptrA->SomeMethod()返回了一个简单的ObjB类型(不是共享ptr)。我可以在sptrB中以某种方式存储该类型吗?这样我就可以做这样的事情,以便返回的类型实例自动转换为boost_shared ptr

sptrB = sptrA->SomeMethod(); 

我只是好奇地询问这个问题,是否可能?

3 个答案:

答案 0 :(得分:5)

创建boost:shared_ptr对象的最标准方法是使用Boost提供的make_shared函数:

#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>

struct A {};

A generator() {
  return A();
}

int main()
{
  using namespace boost;
  shared_ptr<A> p = make_shared<A>(generator());
  return 0;
}

由于generator()函数按值返回A对象,因此上面的语法意味着使用new的复制构造函数调用A,结果指针是包装在共享指针对象中。换句话说,make_shared并不能完全执行转换到共享指针;相反,它在堆上创建对象的副本并为其提供内存管理。这可能是您需要的也可能不是。


请注意,这相当于std::make_shared对C ++ 11中std::shared_ptr的作用。


提供问题中提到的方便语法的一种方法是为shared_ptr<A>定义转化运算符A

struct A {
  operator boost::shared_ptr<A>() {
    return boost::make_shared<A>(*this);
  }
};

然后您可以按如下方式使用它:

shared_ptr<A> p = generate();

这将自动“转换”函数返回的对象。同样,转换在这里实际上意味着堆分配,复制和包装在共享指针中。因此,我不确定我是否建议定义这样的便利转换运算符。它使语法非常方便,但它作为所有隐式转换运算符,也可能意味着您隐式地导致这些“转换”发生在您不期望的地方。

答案 1 :(得分:1)

这取决于ObjA::SomeMethod返回的确切内容 - 副本,引用或指针。在前两种情况下,将它包装到shared_ptr是不可行的(因为shared_ptr需要一个指针)。

第三种情况是可能的,但您必须谨慎行事。确保将对象的指针包装到shared_ptr后,没有其他人尝试管理该对象的生命周期。

例如,如果你返回一个原始指针,将它包装成一个共享指针,然后,在程序后面的某个时刻,某人delete指向同一个指针,你就会遇到问题。

答案 2 :(得分:0)

从 C++ 11 开始,您可以使用 std::make_shared<T>() 函数 (link)

示例:

int a = 10;
std::shared_ptr<int> shared_a = std::make_shared<int>(a);