条件boost :: shared_ptr初始化?

时间:2012-08-02 23:45:03

标签: c++ boost smart-pointers

为了编写更好的代码,我已经致力于使用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的孩子。

2 个答案:

答案 0 :(得分:6)

boost::shared_ptr<X> p;
if( condition ) {
  p.reset( new A() );
}else {
  p.reset( new B() );
}

答案 1 :(得分:3)

  

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

是的,按照Boost shared_ptr Best Practices

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

(所以,例如,我很确定tempX.reset(new TypeA);也是安全的,但我不是百分百肯定。我必须查看文档,我可能想要检查实现。然后我必须仔细考虑所有可能的失败案例并看到所有这些都是正确处理的。如果你遵循这个模式,你和后来维护代码的人不必浪费时间思考这些问题。)

然而,一个注意事项:然而,我会推荐以下任一项,而不是作业:

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

tempX = std::move(intermediateX);

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