3

为了编写更好的代码,我致力于使用 boost 的智能指针。

应该boost::shared_ptr总是像这样初始化吗?

boost::shared_ptr<TypeX> px(new TypeX);

我的困惑源于与此类似的代码块:

void MyClass::FillVector()
{
    boost::shared_ptr<TypeX> tempX;
    if(//Condition a)
    {
        boost::shared_ptr<TypeX> intermediateX(new TypeA);
        tempX = intermediateX;
    }
    else
    {
        boost::shared_ptr<TypeX> intermediateX(new TypeB);
        tempX = intermediateX;
    }
    _typeXVec.push_back(tempX); // member std::vector< boost::shared_ptr<TypeX> >
}

是否有一种可接受的方式来跳过该中间 shared_ptr,同时将其保持在范围内以推回 _typeXVec?

谢谢你。

编辑:想澄清 TypeA 和 TypeB 都是 TypeX 的孩子。

4

2 回答 2

6
boost::shared_ptr<X> p;
if( condition ) {
  p.reset( new A() );
}else {
  p.reset( new B() );
}
于 2012-08-03T01:51:22.767 回答
3

boost::shared_ptr 应该总是这样初始化吗?

是的,根据Boostshared_ptr最佳实践

这不是让智能指针获得动态分配对象所有权的唯一安全方法,但它是一种几乎可以在任何地方使用的通用模式。任何熟悉这种模式的人都很容易查看代码并知道它是正确的。

(因此,例如,我很确定这tempX.reset(new TypeA);也是安全的,但我不是 100% 确定。我必须检查文档,我可能想检查实现。然后我会必须考虑所有可能的失败案例,并确保所有这些都得到正确处理。如果您遵循该模式,您和以后维护代码的人就不必浪费时间思考这些问题。)

但是,请注意:而不是分配,但是,我建议使用以下任一方法:

using std::swap;
swap(tempX, intermediateX);

tempX = std::move(intermediateX);

这些消除了分配所需的不必要的原子引用计数更新的需要。

于 2012-08-02T23:56:17.783 回答