引用计数 - 如何处理包含自身的对象而不显式将引用设置为弱引用

问题描述

这是我的问题:我有一个对象,例如

l = [1,2,3]
l.append(l) # assume that it appends a reference to l,not just [1,3]

现在,当 l 被删除时,它把引用的数量减少了 1,看到引用的数量现在是 1,什么也没做,显然是内存泄漏。

如果我想避免内存泄漏(不显式使用弱引用,例如在 Python 中),我怎么知道什么时候先删除对象的内容

我能想到的唯一方法是,每次我们想要删除一个引用时,我们递归地计算包含在 l 中的对 l 的引用数量在这种情况下,该数字为 1。 然后当我们删除时,我们检查剩余的引用数是否等于对象中包含的引用数。 我们将 2 减为 1,发现包含 1 个对 l 的引用。由于 1 = 1,我们知道然后通过 l删除内容,将引用数量减少到 0 并避免内存泄漏。

我遇到的问题是,对于大型数组或具有很多维度的数组,每次删除引用时都必须展平并搜索对对象的引用可能会出现问题。

在我正在处理的 (C++) 项目中,我已经制作了 std::vector自定义版本,它还允许我查看自上次计算值以来对象是否已被修改,这在这里可以很好地工作,但是 std::unordered_map 我只是单独使用它,并且每次都必须检查对自身的引用数量,知道它可能已更改以及包含在其中的对自身的引用数量本身可能已经改变了。

我在 Python 示例中唯一能想到的其他事情:

  • 它以某种方式自动使对 l 的引用变弱
  • 它懒惰地评估,实际上并没有附加引用(这对我没有真正的帮助)

Python 中的另一个例子是 type 的类型是 type,所以它也永远不会被删除,除非有额外的代码专门用于清理它。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)