我有一个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。