以下面的代码为例,是否会将函数导致对象返回内存泄漏?
我非常好奇函数handle
使用后对象use_age
会发生什么。
class Demo(object):
def _get_mysql_handle(self):
handle = MySQLdb.connect(host=self.conf["host"],
port=self.conf["port"],
user=self.conf["user"],
passwd=self.conf["passwd"],
db=self.conf["db"])
return handle
def use_age(self):
cursor = self._get_mysql_handle().cursor()
if __name__ == "__main__":
demo = Demo()
demo.use_age()
答案 0 :(得分:4)
不,该代码不会导致内存泄漏。
CPython通过引用计数处理对象生存期。在您的示例中,引用计数回退到0,并再次删除数据库连接对象。
handle
中的本地名称_get_mysql_handle
是一个引用,当_get_mysql_handle
返回时它将被删除。self._get_mysql_handle()
的返回值的堆栈是另一个,当表达式结果完成时它也会被删除。.cursor()
是一个方法,因此它将为该方法的self
参数提供另一个引用,直到该方法退出。.cursor()
的返回值可能存储一个引用,当光标本身被收集时它将被删除。那么这取决于cursor
方法中本地use_age()
变量的生命周期。作为本地,它不会超出use_age()
功能。其他Python实现使用垃圾收集策略;例如,Jython使用Java运行时工具。物体可能存活一段时间,但不会“泄漏”。
在Python版本中< 3.4,您需要注意使用定义__del__
方法的自定义类创建循环引用。这些是gc
module不会破坏的循环引用。您可以在gc.garbage
object中内省这些链。