C++ 11清除shared_ptr时,我应该使用reset还是设置为nullptr?

use*_*581 58 c++ reset shared-ptr nullptr c++11

我有一个关于C++ 11最佳实践的问题.清除shared_ptr时,我应该使用reset()没有参数的函数,还是应该设置shared_ptrnullptr?例如:

std::shared_ptr<std::string> foo(new std::string("foo"));
foo.reset();
foo = nullptr;
Run Code Online (Sandbox Code Playgroud)

是否存在任何真正的差异,或者两种方法都存在优势/劣势?

And*_*owl 74

是否存在任何真正的差异,或者两种方法都存在优势/劣势?

在第二种形式(foo = nullptr)是根据第一种形式定义的意义上,这两种选择是绝对等价的.根据C++ 11标准的第20.7.1.2.3/8-10段:

 unique_ptr& operator=(nullptr_t) noexcept;
Run Code Online (Sandbox Code Playgroud)

8 效果:reset().

9 后置条件:get() == nullptr

10 返回:*this.

因此,只需选择最适合您的意图.就个人而言,我更喜欢:

foo = nullptr;
Run Code Online (Sandbox Code Playgroud)

因为它更明显我们希望指针为null.但是,作为一般建议,请尽量减少需要显式重置智能指针的情况.


此外,而不是使用new:

std::shared_ptr<std::string> foo(new std::string("foo"));
Run Code Online (Sandbox Code Playgroud)

考虑std::make_shared()尽可能使用:

auto foo = std::make_shared<std::string>("foo");
Run Code Online (Sandbox Code Playgroud)

  • 好的,三年过去了.希望有人会读到这个......我注意到,你对标准的引用是针对`unique_ptr`而且对于`shared_ptr`没有`operator =(nullptr_t)`方法.是否正确,如果我使用`foo = nullptr`,`nullptr`将被转换为`unique_ptr`然后转换为`shared_ptr`? (4认同)
  • @MarkB:异常安全和少一个分配:有关更详细的讨论,请参阅[此答案](http://stackoverflow.com/a/14837300/1932150). (2认同)
  • 我感到困惑的是,一个谈论*不同类*的答案甚至都没有承认它受到如此高度的支持。正如@mdr 所说,[r0ng 显示](/sf/answers/3260417961/)(尽管没有足够的细节或对优化的关注),`shared_ptr` 没有 `operator=(nullptr_t)` ,因此为其分配 `nullptr` 需要进行转换。我们可能可以证明这在优化构建中无关紧要,但是说“_这两种选择是绝对等效的,因为第二种形式 (foo = nullptr) 是根据第一种形式定义的”_ 似乎完全错误 (2认同)

Wal*_*ter 13

我更喜欢reset()它,因为它标志着意图.但是,尝试编写代码,以便您不需要明确清除a shared_ptr<>,即确保shared_ptr<>在您清除它时超出范围.

  • @RobertF.不,没有性能损失.只是,经常清除指针的需要可能表明设计缺陷. (3认同)