首页 > 解决方案 > 覆盖 Python 析构函数 (__del__) 会导致内存泄漏吗?

问题描述

我有一个脚本,我在其中使用 API 在云上创建一个对象,并希望在某些情况下在脚本末尾删除它。

class ObjCreator():
   def __init__(self, keep_object: bool):
      self.keep_object = keep_object
      print("init")
   
   def create_object(self):
      print("Created object using API")

   def delete_object(self):
      print("Deleting object using API")

   def __del__(self):
      print("Deleting object using API only if keep_object is False")
      if not self.keep_object:
         self.delete_object()

我在 Python 程序上看到了一些内存泄漏,所以显然 GC 不是完美的(即无法收集的对象)。

我担心重写del函数会导致内存泄漏。那可能吗?如果是这样,您对不同的优雅解决方案有什么建议吗?

标签: pythonpython-3.xmemory-leaksgarbage-collectionpython-3.6

解决方案


您的直觉是正确的,覆盖__del__方法意味着__del__不再自动调用基类的方法(尽管我认为这里不太可能发生内存泄漏)。事实上,文档明确提到了这一点

如果基类具有 __del__() 方法,则派生类的 __del__() 方法(如果有)必须显式调用它以确保正确删除实例的基类部分。

CPython repo 中的代码示例:

    def __del__(self):
        # ... your cleanup code here ...
        super().__del__()  # call to base class

推荐阅读