Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 函数返回的对象是否导致内存泄漏_Python_Python 2.7_Memory Leaks - Fatal编程技术网

Python 函数返回的对象是否导致内存泄漏

Python 函数返回的对象是否导致内存泄漏,python,python-2.7,memory-leaks,Python,Python 2.7,Memory Leaks,以下面的代码为例,函数返回的对象是否会导致内存泄漏 我很好奇在被函数use\u age使用后,对象handle会发生什么变化 class Demo(object): def _get_mysql_handle(self): handle = MySQLdb.connect(host=self.conf["host"], port=self.conf["port"],

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

我很好奇在被函数
use\u age
使用后,对象
handle
会发生什么变化

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()

不,该代码不会导致内存泄漏

CPython通过引用计数来处理对象生命周期。在您的示例中,引用计数降回0,并且再次删除数据库连接对象

  • \u get\u mysql\u handle
    中的本地名称
    handle
    是一个引用,当
    \u get\u mysql\u handle
    返回时,它会被删除
  • 保存来自
    self.\u get\u mysql\u handle()
    的返回值的堆栈是另一个堆栈,当表达式结果完成时,它也会被删除
  • .cursor()
    是一个方法,因此在该方法退出之前,它将对该方法的
    self
    参数有另一个引用
  • .cursor()
    的返回值可能存储了一个引用,当光标本身被捕获时,它将被删除。这取决于
    use\u age()
    方法中本地
    游标
    变量的生存期。作为本地用户,它不会超出
    use\u age()
    函数的范围
其他Python实现使用垃圾收集策略;例如,Jython使用Java运行时工具。该物体可能寿命稍长,但不会“泄漏”


在Python版本<3.4中,您确实需要注意使用自定义类创建循环引用,这些自定义类定义了
\uu del\uu
方法。这些是循环引用,不会中断。你可以在中反思这样的链。

不,你为什么会这样想?想到
C/C++
,很好奇python的规则是什么。那么我需要在连接上调用close还是将其留给对象析构函数呢?@loolo:对象析构函数会处理它,但是,如果您依赖于事务,您可能希望更直接地控制连接何时关闭,尤其是在您使用Jython或IronPython的情况下。以上面的代码为例,
\u get\u mysql\u handle
返回的连接只使用一次,之后应该没有对该对象的引用。简言之,在这种情况下,似乎有一个隐含的结束。是真的吗?@loolo:MySQL连接对象被删除时会隐式关闭,是的。Python确保它被删除。