确实将对象从函数引导返回到内存泄漏

时间:2016-02-01 08:21:53

标签: python python-2.7 memory-leaks

以下面的代码为例,是否会将函数导致对象返回内存泄漏?

我非常好奇函数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()

1 个答案:

答案 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中内省这些链。