首页 > 解决方案 > weak_ptr 持有哪些变量?

问题描述

我了解哪些方法可用以及它们是什么。请描述weak_ptr 类的私有部分或给出一些自定义weak_ptr 代码的示例。我无法理解 std::weak_ptr 实现。

标签: c++pointersweak-ptr

解决方案


非侵入式共享指针实现通常包含指向某个动态分配的“状态”的指针,它计算对原始对象的引用数。

当共享指针被复制时,该副本获得指向相同“状态”的相同指针,并且“状态”内的计数递增以指示现在有两个共享指针共享资源。

当共享指针被销毁时,它会递减计数器以指示现在共享资源的指针减少了。如果这导致计数器读数为零,则资源被破坏。

弱指针也有一个指向这个“状态”的指针,但它不会增加或减少计数器。当被询问时,它将使用相同的状态构造一个共享指针,但前提是计数不为零。如果计数为零,则最后一个共享指针已经破坏了资源,我们无法再访问它。

有趣的是,您还需要这样的逻辑来控制“状态”对象的生命周期。:) (我想这是使用第二个计数器实现的,它都会增加shared_ptrweak_ptr但不要引用我的话。)

(your data)         (ref. counters)
     ║                    ║
[resource]             [state]
  ┆  │ │                │ │ │
  ┆  │ └─[shared_ptr]───┘ │ │
  ┆  └───[shared_ptr]─────┘ │
  └┄┄┄┄┄┄┄[weak_ptr]────────┘

当然,任何特定std::weak_ptr实现的私有部分究竟是什么样子取决于编写它的人。

shared_ptr顺便说一句,如果您怀疑它指向的资源可能已经由其他地方的 (s) 管理,那么该图表显示了为什么您不应该从原始指针构造 a shared_ptr:您将获得第二个不相关的“状态”对象,您的计数器将是错误的,并且您的资源可能会过早地被破坏(如果存在这样的概念,肯定会被破坏两次),造成混乱。


推荐阅读