一般而言,我们根本不需要处理关于内存泄露的问题。
毕竟python拥有垃圾自动释放机制。
该机制的简单规则是计算引用某块内存的引用数目来判断是否自动删除。
例如:
- def A():
- s = ["123"]*100
这种创建的时候只有一个引用,即s.
这里可以使用:
- import sys
- print(sys.getrefcount(s)-1)
来查看实际引用数目,减去1是因为这次调用也有一个引用。
这里因为是局部变量,调用函数结束之后就会自动释放掉。
但是如果你使用全局变量s的话,就算调用结束也不会释放掉的,可能就存在危险了。
而我这里出现问题,是因为有一段这样的代码:
- class Class:
-
- def __init__(self, parent):
- ...
- ...
- self.Timer = wx.Timer(self.Parent, -1)
-
- self.Parent.Bind(wx.EVT_TIMER,self.OnTimer,self.Timer)
而这里类又是一个父类,会被很多子类继承并实例化。
这里就会出现子类无法进行自动释放的问题了!
目前个人猜测是
self.Parent.Bind这个操作导致了引用数加1,且无法被释放掉!
无法被释放掉的原因可能类似与C++的智能指针:
当两个对象相互使用一个shared_ptr成员变量指向对方,会造成循环引用,使引用计数失效,从而导致内存泄漏。
其实这个代码本来也是有问题的,一般计时器都是在主线程使用,所以就不会有这样的现象。