假设我有两个shared_ptr类型,例如
boost::shared_ptr<ObjA> sptrA;
boost::shared_ptr<ObjB> sptrB;
现在假设sptrA->SomeMethod()
返回了一个简单的ObjB类型(不是共享ptr)。我可以在sptrB中以某种方式存储该类型吗?这样我就可以做这样的事情,以便返回的类型实例自动转换为boost_shared ptr
sptrB = sptrA->SomeMethod();
我只是好奇地询问这个问题,是否可能?
答案 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);