看计数归零
(这一节用一个自造的小堆 Heap 模拟运行时:alloc(名) 造对象,link(持有者, 名) 让持有者引用它(持有者 None 表示「根」,比如一个变量),unlink 解除引用;计数归零就 free,free 会连带解除它对别人的引用。freed 记录释放顺序。)
用小堆模拟 a = 对象, b = a, del a, del b:
class Heap:
"""一个只有引用计数的小堆:obj 是名字,refs[obj] 是它引用的对象,count[obj] 是有几个地方引用它。"""
def __init__(self):
self.count, self.refs, self.freed = {}, {}, []
def alloc(self, name):
self.count[name] = 0
self.refs[name] = []
def link(self, holder, name):
if holder is not None:
self.refs[holder].append(name)
self.count[name] += 1
def unlink(self, holder, name):
if holder is not None:
self.refs[holder].remove(name)
self.count[name] -= 1
if self.count[name] == 0:
self.free(name)
def free(self, name):
self.freed.append(name)
for child in list(self.refs[name]):
self.unlink(name, child)
del self.count[name]
del self.refs[name]
h = Heap()
h.alloc("列表")
h.link(None, "列表")
h.link(None, "列表")
first = h.count["列表"]
h.unlink(None, "列表")
second = h.count["列表"]
freed_before = list(h.freed)
h.unlink(None, "列表")
print(str(first) + "/" + str(second) + "/" + str(freed_before) + "/" + str(h.freed))
全部评论