Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6319749
  • 博文数量: 2759
  • 博客积分: 1021
  • 博客等级: 中士
  • 技术积分: 4091
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-11 14:14
文章分类

全部博文(2759)

文章存档

2019年(1)

2017年(84)

2016年(196)

2015年(204)

2014年(636)

2013年(1176)

2012年(463)

分类:

2012-08-29 03:25:51

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

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

    我曾经尝试过靠自己勤劳的双手来封装 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.
阅读(874) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~