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

CIsForCookies

我找到了此内存泄漏检测代码段,并且想知道它生成的内存泄漏。

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是新的,许多人可能仍在使用Python1.x。

Python 1.x仅依靠引用计数来进行垃圾回收,而循环引用是失败时的教科书示例。Python 2.x添加了一个循环检测步骤,但是仍然存在一些皱纹,例如存在__del__一种阻塞垃圾收集器方法,因为它无法确定正确的销毁顺序。从Python 3.4开始,大多数皱纹已被消除

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么即使删除后std :: string也会导致类中的内存泄漏

为什么此JavaScript会导致内存泄漏?

为什么调用堆栈数组会导致内存泄漏?

为什么使用“ new”会导致内存泄漏?

为什么重复调用FileOpenDialog会导致内存泄漏?

为什么这个函数会导致内存泄漏?

为什么基本的Swift代码会导致内存泄漏?

为什么嵌套的initializer_list会导致内存泄漏

为什么此功能会导致内存泄漏?

为什么在打印时将列表附加到自身上会显示[...]?

为什么 asyncio.sleep() 会导致“将 Future 附加到不同的循环”?

为什么使用 make_unique<> 将函数传递给线程会导致 Valgrind 中的内存泄漏?

为什么附加到类实例的列表然后从方法返回它会导致一个空列表?

为什么指向同一个内存的多个共享指针会导致内存泄漏?

为什么Rxjava可能导致内存泄漏

Delphi:为什么这会导致内存泄漏?

为什么 Devel::LeakTrace 会泄漏内存?

是否有为什么会AccessibilityManager.sInstance导致内存泄漏的一个原因?

为什么Node.js中的全局数组会导致内存泄漏?

如果重置了回调,为什么静态Drawable会导致Android泄漏内存?

为什么这个二进制输出代码会导致内存泄漏

为什么Objective-C中的“ try catch”会导致内存泄漏?

为什么类型化数组会导致JavaScript中的内存泄漏

为什么用CGImageSource加载gif会导致内存泄漏?

为什么C#中的Lambda表达式会导致内存泄漏?

为什么此Observable.Generate过载会导致内存泄漏?[使用Timespan <15ms]

为什么向向量添加智能指针会导致内存泄漏?

iOS-可能会删除nsmutablearray导致内存泄漏?

为什么在从 String 列表转换为 Double 列表时将 <?> 添加到 List 声明会导致错误?