在使用python脚本和底层C++对象进行交互的过程中发生了一个问题:由于底层C++对象的创建和删除决定权由底层决定,当底层决定删除这些对象而上层仍然在“强引用”这些对象的时候,就会导致“如果上层这些“强引用”不删除,则底层C++对象将一直留在内存里”的现象。
什么情况下会出现这种情况呢?比如:场景管理器所管理的模型对象,当玩家很久没看到他们的时候,底层对象管理员会决定将这些对象删除掉以释放内存。但是,由于这些对象已经被上层python脚本所“强引用”,这个时候,就会出现这种浪费内存的现象了。
如何解决这个问题呢?python提供了弱引用技术,请看下看。
和许多其它的高级语言一样,Python使用了垃圾回收器来自动销毁那些不再使用的对象。每个对象都有一个引用计数,当这个引用计数为0时Python能够安全地销毁这个对象。

使用weakref模块,你可以创建到对象的弱引用,Python在对象的引用计数为0或只存在对象的弱引用时将回收这个对象。

创建弱引用

你可以通过调用weakref模块的ref(obj[,callback])来创建一个弱引用,obj是你想弱引用的对象,callback是一个可选的函数,当因没有引用导致Python要销毁这个对象时调用。回调函数callback要求单个参数(弱引用的对象)。

弱引用是对一个对象(称为 referent)的引用的持有者。使用弱引用后,可以维持对 referent 的引用,而不会阻止它被垃圾收集。当垃圾收集器跟踪堆的时候,如果对一个对象的引用只有弱引用,那么这个 referent 就会成为垃圾收集的候选对象,就像没有任何剩余的引用一样,而且所有剩余的弱引用都被清除。(只有弱引用的对象称为弱可及(weakly reachable)。)

一旦你有了一个对象的弱引用,你就能通过调用弱引用来获取被弱引用的对象。下面的例子创建了一个对socket对象的弱引用:
>>> from socket import *
>>> import weakref
>>> s=socket(AF_INET,SOCK_STREAM)
>>> ref=weakref.ref(s)
>>> s
<socket._socketobject instance at 007B4A94>
>>> ref
<weakref at 0x81195c; to 'instance' at 0x7b4a94> 
>>> ref()    #调用它来访问被引用的对象
<socket.socketobject instance at 007B4A94>

一旦没有了对这个对象的其它的引用,调用弱引用将返回None,因为Python已经销毁了这个对象。
注意:大部分的对象不能通过弱引用来访问。

weakref模块中的getweakrefcount(obj)和getweakrefs(obj)分别返回弱引用数和关于所给对象的引用列表。

弱引用对于创建对象(这些对象很费资源)的缓存是有用的。

创建代理对象

代理对象是弱引用对象,它们的行为就像它们所引用的对象,这就便于你不必首先调用弱引用来访问背后的对象。通过weakref模块的proxy(obj[,callback])函数来创建代理对象。使用代理对象就如同使用对象本身一样:
>>> from socket import*
>>> import weakref
>>> s=socket(AF_INET,SOCK_STREAM)
>>> ref=weakref.proxy(s)
>>> s
<socket._socketobject instance at 007E4874>
>>> ref 
<socket._socketobject instance at 007E4874>
>>> ref.close() #对象的方法同样工作

callback参数的目的和ref函数相同。在Python删除了一个引用的对象之后,使用代理将会导致一个weakref.ReferenceError错误:
>>> def s
>>> ref
Traceback (most recent call last):
  File "<stdin>", line 1, in ?

上面对python提供的垃圾回收器和弱引用技术的

转载于:https://www.cnblogs.com/bjdxy/archive/2013/01/16/2862709.html

弱引用的用途:在底层C++对象被上层python脚本对象使用时(转)相关推荐

  1. iOS之深入解析内存管理散列表SideTables和弱引用表weak_table的底层原理

    一.SideTables 和 weak_table 的关系 在 runtime 中,有四个数据结构非常重要,分别是 SideTables,SideTable,weak_table_t 和 weak_e ...

  2. python中实例和对象的区别,python类对象和实例对象有什么区别吗

    python类对象和实例对象有什么区别吗 发布时间:2020-07-20 14:10:37 来源:亿速云 阅读:119 作者:清晨 这篇文章主要介绍python类对象和实例对象有什么区别吗,文中介绍的 ...

  3. java 虚引用 作用_Java的强引用、弱引用、软引用和虚引用,以及用途

    Java种除了基本数据类型,其它数据类型都是引用的数据类型.而应用数据类型根据生命周期的长短又分为:强引用.弱引用.软引用和需引用(幻象引用),我们平时基本上只用到强引用类型,而其他的引用类型我们也就 ...

  4. iOS 中集合如何弱引用对象

    1. 使用 NSValue NSValue 可以弱引用保存一个对象,我们可以使用这种方法间接的引用. NSValue *value = [NSValue valueWithNonretainedObj ...

  5. 理解Java中的弱引用(Weak Reference)

    理解Java中的弱引用(Weak Reference) 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限, ...

  6. 弱引用是什么,和其他引用有啥区别?

    前言 最近看 WeakHashMap 代码时,发现了一个名词叫 弱引用 ,然而我居然没听说过,这可不能忍所以打算研究下这是啥玩意儿. 其实就是多看几篇博客,然会汇总下而已... 四种引用的定义 Jav ...

  7. Java 理论与实践: 用弱引用堵住内存泄漏---转载

    要让垃圾收集(GC)回收程序不再使用的对象,对象的逻辑 生命周期(应用程序使用它的时间)和对该对象拥有的引用的实际 生命周期必须是相同的.在大多数时候,好的软件工程技术保证这是自动实现的,不用我们对对 ...

  8. python 弱引用

    文章目录 创建弱引用 创建代理对象 循环引用 缓存对象 (WeakValueDictionary) 垃圾回收 和许多其它的高级语言一样,Python使用了垃圾回收器来自动销毁那些不再使用的对象.每个对 ...

  9. 一文讲透java弱引用以及使用场景

    文章目录 概念 深入原理 应用案例解析 概念 大部分情况下我们看到是强引用,比如下面这一行: String str1 = new String("abc"); 变量str1被用来存 ...

最新文章

  1. django设置cookie和session
  2. OpenWRT 随记
  3. Android可输入的下拉框,android 可编辑的下拉框 Demo
  4. java: cannot execute binary file错误
  5. 分布式事物(2PC,3PC,CAP,柔性与刚性事物,LCN)
  6. Google X 新项目,用计算机视觉养鱼?
  7. C#的String.Split方法
  8. python----运行机制
  9. 阿里云云计算 40 CDN的概念
  10. 一文读懂TOGAF企业架构
  11. 关于VC6和VC9的区别
  12. 哈工大离散数学期末试题2021回忆版
  13. 信息学奥赛一本通习题答案(一)
  14. C++ 读取TXT文件
  15. 未来计算机体系结构探索,未来计算机体系结构将是什么样的发展趋势
  16. JAVA怎么打开pkg_PKG文件在电脑上怎么打开!(普通PC)
  17. 问题:_ZN6caffe28TypeMeta21_typeMetaDataInstanceIN3c107complexINS2_4HalfEEEEEPKNS_
  18. python编程怎么画三角形的外接圆_用MATLAB画三角形外接圆
  19. 计算机网络实验报告 静态路由的配置
  20. 基于C++的OpenCV(八)图像处理

热门文章

  1. Mysql存储时间字段
  2. 0502团队项目 SCRUM团队成立
  3. 批量删除数据库中有特定开始字符的表、视图和存储过程
  4. HLSL的一些常见渲染特效的实现
  5. ORACLE常用命令【转】
  6. NVIDIA | 一种重建照片的 AI 图像技术
  7. ★自制社交网站等级称号
  8. Qt on Android:将Qt调试信息输出到logcat中
  9. 读书笔记 effective c++ Item 16 成对使用new和delete时要用相同的形式
  10. Linux压缩解压缩命令