std::Shared_PTR:Reset()与赋值

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (92)

我对reset()成员函数std::shared_ptr除了转让经营者之外,它还有什么贡献?

具体而言,根据定义:

auto p = std::make_shared<int>(1);
  1. 以下两行等效: P=STD::_共享<int>(5);p.重置(新的int(5));
  2. 这些东西呢? P=nullptr;

如果这两行在这两种情况下都是等价的,那么这两行的目的是什么?reset()

问题是:有没有案子reset()让我们实现一些没有它就不那么容易实现的事情?

提问于
用户回答回答于

有可能reset以避免在某些情况下进行动态内存分配。考虑一下代码

std::shared_ptr<int> p{new int{}};  // 1
p.reset(new int{});                 // 2

在第1行中,发生了两个动态内存分配,一个用于int对象的第二个shared_ptr的控制块,它将跟踪对托管对象的强/弱引用的数量。

在第2行中,再次为新的int对象。在…的身体内resetshared_ptr将确定没有其他强引用对以前管理的int,所以它必须delete它。由于也没有任何弱引用,它也可以释放控制块,但在这种情况下,实现重用相同的控制块是谨慎的,因为否则它将不得不分配一个新的。

如果总是必须使用赋值,则上述行为是不可能的。

std::shared_ptr<int> p{new int{}};    // 1
p = std::shared_ptr<int>{new int{}};  // 2

在这种情况下,对shared_ptr第2行上的构造函数已经分配了一个控制块,因此p将不得不释放它自己现有的控制块。

用户回答回答于

使用时reset()传递给重置的参数不必是托管对象(也不能是托管对象);=右侧必须是托管对象。

因此,这两行给出的结果是相同的:

p = std::make_shared<int>(5); // assign to a newly created shared pointer
p.reset(new int(5)); // take control of a newly created pointer

但我们不能:

p = new int(5); // compiler error no suitable overload
p.reset(std::make_shared<int>(5).get()); // uh oh undefined behavior

reset()如果不创建并分配共享指针,则无法将共享指针重新分配到不同的原始指针。无=将无法使共享指针指向另一个共享指针。

扫码关注云+社区