Personal tools
蜻蜓点水 举重若轻

Python 中的内存泄漏

Python 中的内存泄漏 ,在 Python 中产生内存泄漏的技术。

——献给那些有内存泄漏相伴的日子

    事实证明,写程序是一件非常好玩的事情。

    我曾经尝试过靠自己勤劳的双手来封装 Python 的扩展模块(不使用工具),但是我很明智地发现也许以我的智商可能无法来很好地管理那些强的或是弱的引用计数……于是我动摇了。

    动摇的结果是:我开始使用 SWIG 来做这件事情。

    我心中的一个声音在风雨交加的夜空中高喊着:再见了,怎么删也删不掉的内存;还有那些没有删就自动消失的意外内存……

    好了,让我们再次回到那个“自动垃圾收集时代”的著名笑话吧……

>>> class LeakTest(object):
def __init__(self):
print 'Object with id %d born here.' % id(self)
def __del__(self):
print 'Object with id %d dead here.' % id(self)

>>>
T1 = LeakTest()
Object with id 10462352 born here.
>>> T2 = T1
>>> T1 = None
>>> T2 = None
Object with id 10462352 dead here.

不错,这就是我们逃难到 Python 的原因,垃圾总是会自动地消失得无影无踪。然后……

>>> A = LeakTest()
Object with id 10462512 born here.
>>> B = LeakTest()
Object with id 10462544 born here.
>>> A.b = B
>>> B.a = A
>>> A = None
>>> B = None

也就是说,在指针 AB 移情别恋时其原来所指向的内存却没有消失。原因是在 "A = None" 时,因为

A.b 还指着 B ,所以 A 所指的对象还不能删除。同理,因为原来 A 所指的对象还在,所以因为 "B.a = A" 的缘故,对象 B 也不能删除。

这时 AB 已经为 None ,于是产生了一处内存泄漏。

初略想想,想让 Python 内存泄漏似乎比 C/C++ 还快呢(千万不要写 self.xxx = self)。

最后写一个带作用域的作为结束,以博诸公一笑。

>>> def foo():
A = LeakTest()
B = LeakTest()
A.b = B
B.a = A

>>>
foo()
Object with id 10462448 born here.
Object with id 10462832 born here.
 

本站由 润普公司资助, 采用 易度CMS 构建。

广而告之:润普公司 易度在线工作平台,包括 易度文档管理系统 易度项目管理系统 , 易度部门管理 ,均采用Zope 3/BFG技术开发。
沪ICP备05008050