gpt4 book ai didi

python - 为什么将列表附加到自身,然后删除,导致内存泄漏

转载 作者:行者123 更新时间:2023-12-03 18:06:22 37 4
gpt4 key购买 nike

我找到了这个 memory leak detection snippet并且想知道它产生的内存泄漏。

import gc

def dump_garbage():
"""
show us what's the garbage about
"""

# force collection
print("\nGARBAGE:")
gc.collect()

print("\nGARBAGE OBJECTS:")
for x in gc.garbage:
s = str(x)
if len(s) > 80: s = s[:80]
print(type(x),"\n ", s)

if __name__=="__main__":
import gc
gc.enable()
gc.set_debug(gc.DEBUG_LEAK)

# make a leak
l = []
l.append(l)
del l

# show the dirt ;-)
dump_garbage()

为了测试gc内存泄漏检测,作者创建了自己的小内存泄漏:
l = []
l.append(l)
del(l)

为什么会导致泄漏?正如我所看到的,我会有一个列表对象,而不是一个嵌套的列表对象,其中内部是外部,而不是删除外部。难道 gc 不知道删除对原始列表的所有引用,从而导致内部列表泄漏吗?

最佳答案

(将我之前的评论编辑为答案。)

链接的文章是 2001 年的。在那个年代,Python 2.x 是新的,很多人可能还在使用 Python 1.x。

Python 1.x 仅依赖于垃圾收集的引用计数,循环引用是失败时的教科书示例。 Python 2.x 添加了循环检测步骤,但仍有一些问题,例如 __del__ 的存在阻塞垃圾收集器的方法,因为它无法找出正确的销毁顺序。从 Python 3.4 开始,most of the wrinkles have been ironed out .

那么为什么示例代码仍然指示泄漏?它设置了 GC_DEBUG_LEAK 标志,除其他外,明确告诉垃圾收集器保留无法访问的对象!

关于python - 为什么将列表附加到自身,然后删除,导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58687834/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com