【问题标题】:What Happens to a weak_ptr when Its shared_ptr is Destroyed?当它的 shared_ptr 被销毁时,weak_ptr 会发生什么?
【发布时间】:2016-03-06 23:05:10
【问题描述】:

似乎weak_ptr 不知何故只知道它引用的@​​987654322@ 何时被销毁。那个怎么样?是否有一个恒定的链接保持或什么?

following code for example

weak_ptr<int> test() {
    shared_ptr<int> foo{new int};

    return foo;
}

int main() {
    auto foo = test();

    cout << foo.expired() << endl;
}

weak_ptr&lt;int&gt; 去检查shared_ptr&lt;int&gt; 的状态时,我预计会出现段错误,但没有。 weak_ptr&lt;int&gt; 正确地将内存标识为已释放。它是怎么知道的?

【问题讨论】:

  • 'std::weak_ptr' 以与 'std::shared_ptr' 相同的方式保存对共享引用计数的引用。唯一的区别是 'std::weak_ptr' 不会增加/减少这个计数。
  • 我本以为会出现段错误... 为什么?这就是weak_ptr的重点
  • @UmNyobe 好点!我想我是想表达我不明白它是如何工作的。

标签: c++ shared-ptr weak-ptr


【解决方案1】:

std::shared_ptr 是使用两块内存创建的:

  • 资源块:它保存指向实际底层数据的指针,例如'int*'

  • 控制块:它保存特定于 shared_ptr 的信息,例如引用计数。

(有时为了提高效率,它们被分配在一块内存中,请参阅std::make_shared

控制块 存储weak_ptr的引用计数。直到最后一个 weak_ptr 超出范围(弱指针引用计数降至零),它才会被释放。

所以weak_ptr 将知道它已过期,因为它可以访问此控制块,并且它可以检查shared_ptr 的引用计数是多少

【讨论】:

  • 我这里有误会。所以你是说控制块实际上存储了2个计数? weak_ptrs 的数量和shared_ptrs 的数量?直到 BOTH 都为 0 才被销毁?
  • @JonathanMee:是的,从概念上讲就是这样。对了,你可以打开你的标准库头文件,自己看看实现!
  • @AndyG 不知道。我只是完全不明白weak_ptrs 是如何工作的。感谢您的解释!我很快就会接受。
  • @JonathanMee:推论是,当您使用 make_shared 将两者分配到单个内存块中时,该内存会浮动,直到您的所有 weak_ptrs 也超出范围。
  • 我不确定这是否是唯一可能的实现,标准通常只描述接口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多