【问题标题】:Reference counting: how to make sure two linked objects keep existing when you own at least one?引用计数:当您拥有至少一个时,如何确保两个链接对象保持存在?
【发布时间】:2015-08-01 02:33:54
【问题描述】:

假设我有两个对象:AB

两个对象都有一个引用计数属性。

AB 可以独立创建。它们的引用计数在创建时初始化为 1。

A 可能与B 相关联。发生这种情况时,A 会获得对B 的引用(B 的引用计数会增加),而B 会获得对A 的弱引用(以避免循环)。

如果AB 相关联,并且您拥有对AB(或两者)的引用AB 必须被破坏。当所有对它们的外部引用都丢失时,这两个对象都需要销毁。

这是典型的强引用和弱引用的问题情况:

A = createA()   # A's ref count: 1
B = createB()   # B's ref count: 1
associate(A, B) # B's ref count: 2
put(A)          # A's ref count: 0
  -> A is destroyed
  -> B is put by A (B's ref count: 1)
  -> B is notified that A was destroyed
    -> B's weak reference to A is reset

A 不应在此处销毁,因为您仍然拥有对 B 的引用。

如何做到这一点?

我还要告诉你,createA()createB()associate() 是无法破坏的现有 API 的一部分。不过AB 的内部结构可能会发生变化。

【问题讨论】:

    标签: memory-management reference-counting


    【解决方案1】:

    你提出这个问题的方式是无法解决的。这就是为什么弱/强方案总是有“所有者”或“父级”的概念,这是具有强引用并且必须是您保持最长生命的那个。

    要在对象之间进行循环引用,无需手动生命周期管理,并且对象的生命周期依赖于整个循环,那么您需要一个垃圾收集器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      • 2023-03-20
      • 2019-06-12
      • 2018-10-03
      相关资源
      最近更新 更多