我有一个shared_ptrs的 vector ,如下所示。

std::vector<std::shared_ptr<SharedThing>> things;

现在假设我将多个shared_ptrs推到 vector 上,每个元素现在的引用计数为1。

当我需要用新的shared_ptr替换这些元素之一时,我希望旧的shared_ptr超出范围。常规元素分配将实现此目的,还是仅复制shared_ptr内容。例如:
things.at(0) = new_shared_ptr;

这会减少对Things.at(0)的引用计数并增加new_shared_ptr的计数吗?

最佳答案

是的,基本上你是对的。
为了更准确,以前的shared_ptr在(0)处的引用计数将减少。然后为它分配一个新的shared_ptr,它的计数可能为1。看起来在(0)处的引用计数是相同的,但是它又变了又变回来。

您可以通过std::shared_ptr::use_cout()进行验证

有关更多详细信息,我们可以在以下情况下调试到STL中:things.at(0) = new_shared_ptr;

  __shared_count&
  operator=(const __shared_count& __r) noexcept
  {
_Sp_counted_base<_Lp>* __tmp = __r._M_pi;
if (__tmp != _M_pi)
  {
    if (__tmp != 0)
      __tmp->_M_add_ref_copy();
    if (_M_pi != 0)
      _M_pi->_M_release();
    _M_pi = __tmp;
  }
return *this;
  }

新的_M_add_ref_copy(),然后是前一个_M_release(),这会将_M_use_count减少1。

09-06 15:38