【问题标题】:Implementation of lock()lock() 的实现
【发布时间】:2018-01-01 20:22:26
【问题描述】:

根据升压:

要访问对象,可以使用 shared_ptr 构造函数或成员函数 lock 将 weak_ptr 转换为 shared_ptr。

再次,来自提升:

shared_ptr<T> lock() const;

//Returns: expired()? shared_ptr<T>(): shared_ptr<T>(*this).

据我了解,返回shared_ptr&lt;T&gt;(*this) 意味着创建一个引用计数为1 的新shared_ptr;而这绝对不是我们想要的。所以可能我没有正确理解它。有人会解释吗?谢谢!

【问题讨论】:

    标签: c++ boost weak-ptr


    【解决方案1】:

    不,这实际上是 shared_ptr 的点 - 复制的实例将指向相同的基础数据并增加两个实例的引用计数。

    这意味着shared_ptr&lt;T&gt;(*this) 将创建一个额外的shared_ptr 实例指向相同的数据,并将增加this 和新实例的引用计数。


    在实际代码中实际上更复杂,因为原始shared_ptr 数据是通过weak_ptr 实例访问的,但实际上原始shared_ptr 数据在最后共享(共享引用计数在特定shared_ptr 对象的所有现有副本)。

    【讨论】:

    • 但是,“Returns:”行中显示的代码不是线程安全的。我猜这就是它现在实际实现的方式(我的标准注释副本,“以原子方式执行”)。
    • 这表示template&lt;class Y&gt; explicit shared_ptr(weak_ptr&lt;Y&gt; const &amp; r);被调用了?
    • 是的,从技术上讲,原始 shared_ptr 实例是通过weak_ptr 访问的,但仍然是(更新了答案以提及)。
    • “原始shared_ptr实例被访问”是什么意思?
    • 更准确地说,是原始共享数据(参见 Boost 源代码中的 shared_count( weak_count const &amp; r, sp_nothrow_tag ) 实现,它实际上在这种情况下完成了主要工作)。
    猜你喜欢
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2015-08-16
    相关资源
    最近更新 更多