【问题标题】:Does it have memory leak?它有内存泄漏吗?
【发布时间】:2012-07-27 08:52:27
【问题描述】:

最近看了objgraph的文档,对下面的代码一头雾水

>>> class MyBigFatObject(object):
...     pass
...
>>> def computate_something(_cache={}):
...     _cache[42] = dict(foo=MyBigFatObject(),
...                       bar=MyBigFatObject())
...     # a very explicit and easy-to-find "leak" but oh well
...     x = MyBigFatObject() # this one doesn't leak

它表明“一个非常明确且易于发现的'泄漏'”。这有内存泄漏吗?是 dict _cache 吗?

【问题讨论】:

  • 这不是泄漏,因为只要computate_something 在范围内,总会有对_cache 的引用,所以它会一直保留在内存中

标签: python memory-leaks objgraph


【解决方案1】:

_cache 是一个具有可变默认值的关键字参数,它确实在函数体中发生了变异。这会将MyBigFatObjects 实例永久存储在该可变关键字参数中。

这与其说是泄漏,不如说是对可变关键字参数的寿命的误解。函数本身仍然可以调用del _cache[42] 来删除这些对象。

有关该主题的更多信息,请参阅"Least Astonishment" and the Mutable Default Argument

【讨论】:

    【解决方案2】:

    由于 dict 是可变的,因此其中所做的更改也会影响调用者,因此将保留对两个 MyBigFatObject 的引用。

    您应该明确删除它 (del _cache[42]),或者更改自己的字典副本或任何其他可变对象(您可以使用 copy 模块)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-16
      • 2019-12-21
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多