gpt4 book ai didi

c++ - shared_ptr 分配 : order of reference counting

转载 作者:行者123 更新时间:2023-11-27 22:49:26 27 4
gpt4 key购买 nike

当您使用 shared_ptr 的复制赋值运算符时,从概念上讲,shared_ptr赋值左侧的对象需要减少它当前拥有的对象的引用计数,然后增加赋值右侧对象的引用计数。 (当然,假设两个指针都是非空的。)

所以一个实现可能类似于下面的伪代码:

shared_ptr& operator = (const shared_ptr& rhs)
{
decrement_reference_count(this->m_ptr);
this->m_ptr = rhs.m_ptr;
increment_reference_count(this->m_ptr);
return *this;
}

但请注意,这里我们减少了 this 的引用计数。 之前 我们增加了 rhs 的引用计数.我们也可以反过来做。我的问题是,标准是否实际指定了此处的顺序?

为什么会有所不同:如果 this 的引用计数之间存在某种依赖关系,它可能会产生很大的不同。和 lhs 的引用计数.例如,假设两者都是链表结构的一部分,其中 next每个链接节点中的指针是一个 shared_ptr .因此,减少结构中任何节点的引用计数都可能触发析构函数,然后引发链式 react 并减少(也可能破坏)链中每个其他节点的引用计数。

因此,假设引用计数为 lhs 的情况受 this 的引用计数影响, 如果我们递减 this 会有很大的不同, 或者我们先增加 lhs .如果我们先增加 lhs 递减之前this , 那么我们可以确定 lhs当我们减少 this 时不会被破坏.

但是标准实际上在这里指定了顺序吗?据我所知,标准唯一说的是复制赋值运算符等同于表达式:

shared_ptr(lhs).swap(*this)

但我无法真正理解这种等效性可能对引用计数的递减/递增顺序产生的影响(如果有的话)。

那么标准在这里规定了顺序吗?还是这个实现定义了行为?

最佳答案

标准说 [20.7.2.2.3]

shared_ptr& operator=(const shared_ptr& r) noexcept;

效果等同于

shared_ptr(r).swap(*this)

这意味着构造一个临时文件,增加r的引用计数,然后用*this交换它的数据,然后销毁临时文件,这意味着减少引用计数曾经属于*this

关于c++ - shared_ptr 分配 : order of reference counting,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38958822/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com