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

使用标准库weakref,它可以创建一种能访问对象但不增加引用计数的对象
若引用通过循环引用来解决这个问题,本质上说,
弱引用时一个指向对象的指针,但不会增加对象本身的引用计数。

import weakref
class Data(object):
    def __init__(self, value, owner):
        # self.owner = owner
        self.owner = weakref.ref(owner)  # 更改为
        self.value = value

    def __str__(self):
        # return "%s's data, value is %s" % (self.owner, self.value)
        # 更改为,注意调用时要加括号
        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....')

运行结果

in Node.__del__
in data.__del__
wait.... 

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 Java 和 C/C++ 的一个重大区别,就是它没有"指针"的概念,这并不代表 Java 不需要只用指针,而...
    seraphzxz阅读 7,251评论 0 54
  • 指针 在传统的C++编程中,指针的使用一直是一把双刃剑。指针赋予了我们直接操作硬件地址的能力,但同时也带来了诸多问...
    passerbywhu阅读 8,059评论 0 2
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,912评论 1 32
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 13,165评论 1 51
  • 包(lib)、模块(module) 在Python中,存在包和模块两个常见概念。 模块:编写Python代码的py...
    清清子衿木子水心阅读 9,236评论 0 27

友情链接更多精彩内容