1. 苏葳的备忘录首页
  2. 编程

Python文档中关于引用计数的一段翻译

python 引用计数在C或C++之类的语言中,程序员需负责在堆上动态分配和回收内存。在C中,通过使用malloc()和free()函数完成,在C++中,操作符new和delete以本质相同的方式运行,以下的讨论将限于C的情况。每块用malloc分配的内存应该最终被返回可用内存池,通过调用free(),在正确的时候调用free()是非常重要的。如果忘掉了一块内存地址并且没有对其调用free(),它拥有的内存直到程序终止之前是不能重用的。这被称为内存泄漏。

另一方面,如果一个程序调用了free()却继续使用这个块,它就会与另一个malloc()请求发生冲突,这被称为使用已经释放的内存,这将造成与引用未初始化的数据同样的后果–程序异常退出(核心转储),错误的结果,无法解释的崩溃。一个常见的内存泄漏的原因是不正常的代码路径,例如,一个函数分配了一块内存,做了一些计算,接着释放了这个块。现在需求修改了,可能是对计算增加了一个测试条件,发现了一个错误并提前从函数返回。这就很容易在提前返回时忘掉释放分配的内存块,尤其是它在之后才加入代码的情况下。这种泄漏,一旦发生,通常很长时间不会被检测到:在所有调用中只有很小机率错误退出,而大多数现代电脑都有大量的虚拟内存,于是这种泄漏只有在长时间运行并且频繁使用泄漏函数时才会表现出来,因此,制定编码约定和策略在一开始时就防止泄漏以最小化这种错误就非常重要。

因为python大量使用malloc()和free(),它需要一种策略避免内存泄漏和错误使用释放过的内存。选用的方法被称为引用计数。原理是简单的:每个对象包含一个计数器,当引用一个保存在某地的对象时加一,当引用被删除时减一。当计数器减为0时,最后一个对象的引用被删除并且对象释放。另一种不同的方法被称为自动垃圾收集(有时,引用计数也被指代垃圾收集方法,因此我使用了“自动”来区别这两个),自动垃圾收集的很大好处在于用户不需要显式调用free()。(另一个宣称的优点是速度或内存使用的提升,然而这并非最有吸引力的原因),缺点是对于C,没有真正轻量的自动垃圾收集器,而引用计数可以方便的实现(尽管malloc和free函数可以使用–它由C标准予以保障)。也许某天会出现一个足够简练的C的自动垃圾收集器,在那时之前,我们将不得不生活在引用计数里。

尽管Python使用了传统的引用计数实现,它也提供了循环检测器来循环引用。这就允许应用程序不用提心创建了直接或间接的循环引用,而这些正是仅仅使用引用计数的垃圾收集实现的弱点。循环引用由包含对他们自身的引用的对象组成,因此每个循环中的对象具有非零的引用计数。典型的引用计数实现不能重用循环引用中任何对象的内存,或者循环

原文链接:http://docs.python.org/extending/extending.html#ownership-rules

注:在http://gashero.yeax.com/?p=38 发现了上面链接更好且完整的翻译,特此留存。

 

原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/421.html

发表评论

邮箱地址不会被公开。 必填项已用*标注