看计数归零

👁️ 2 人浏览 💬 0 人评论 ❤️ 添加收藏

(这一节用一个自造的小堆 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))
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论