如何在环状数据结构中管理内存?

需求:
在python中,垃圾回收器通过引用计数来回收垃圾对象,但某些环状数据结构(树,图。。),存在对象间循环引用,比如树的父节点引用子节点,子节点也同时引用父节点。此时同时del掉引用父子节点,两个对象不能被立即回收。
如何解决此类的内存管理问题?

思路:
使用标准库weakref,它可以创建一种能访问对象但是不增加引用计数的对象

代码:

import weakref

# 下面构造两个类,他们互相引用
class Data(object):
    
    def __init__(self,value,owner):
        self.owner = weakref.ref(owner)  # 使用弱引用的方法,不增加计数
        self.value = value

    def __str__(self):
        return "%s's data,value is %s" % (self.owner(),self.value)

    def __del__(self):
        print('in Data.__del__')

class Node(object):
    
    def __init__(self,value):
        self.data = Data(value,self)

    def __del__(self):
        print('in Node.__del__')

node = Node(100)
del node        # 可以看到对象都被回收掉了
input('wait....')

猜你喜欢

转载自www.cnblogs.com/Richardo-M-Q/p/13388450.html