boost shared_ptr:operator =和reset之间的区别?

rtu*_*ado 11 c++ boost shared-ptr

以下两段代码之间是否有任何差异?他们中的任何一个比另一个更好吗?

运算符=

boost::shared_ptr<Blah> foo; // foo.ptr should be NULL
foo = boost::shared_ptr<Blah>(new Blah()); // Involves creation and copy of a shared_ptr?
Run Code Online (Sandbox Code Playgroud)

重启

boost::shared_ptr<Blah> foo; // foo.ptr should be NULL
foo.reset(new Blah()); // foo.ptr should point now to a new Blah object
Run Code Online (Sandbox Code Playgroud)

注意:我需要定义shared_ptr然后将其设置在不同的行中,因为我在一段代码中使用它,如:

boost::shared_ptr<Blah> foo;
try
{
  foo.reset...
}
foo...
Run Code Online (Sandbox Code Playgroud)

Bjö*_*lex 15

operator=分配shared_ptr到一个shared_ptr,而reset使得shared_ptr指针的取得所有权.所以,基本上你发布的例子没有区别.也就是说,你不应该更喜欢它们而只是使用make_shared:

foo = boost::make_shared<Blah>();
Run Code Online (Sandbox Code Playgroud)

此外,如果可能,您可以shared_ptr通过将try-catch块包装在一个单独的函数中来阻止必须声明a 而不进行初始化,该函数只返回一个shared_ptr新创建的对象:

boost::shared_ptr<Blah> createBlah() {
    try {
        // do stuff
        return newBlah;
    }
    catch ...
}
Run Code Online (Sandbox Code Playgroud)