如何在Python中释放堆内存

ALI*_*HIR 2 python memory-leaks heap-memory

我来自 C++,我在堆内存上工作,在那里我必须删除我使用“new”关键字在堆上创建的堆内存,我总是很困惑如何在 python 中为堆内存做什么来阻止内存泄漏推荐我任何有关 python 内存分配和删除细节的文本。谢谢

Wil*_*sem 5

您不必执行任何操作:Python 首先使用引用计数。这意味着,对于每个对象,它都拥有一个计数器,当您通过新变量引用该对象时,该计数器会递增;如果您让该变量指向其他对象,则该计数器会递减。如果计数器为零,则该对象将被删除(或计划删除)。

但这还不够,因为两个对象可以互相引用,因此即使没有其他变量引用这些对象,这些对象也会使彼此保持活动状态。为此,Python 有一个(可选)垃圾收集器来进行循环检测。如果发现此类循环,则删除对象。您可以通过致电 来安排此类收集gc.collect()

简而言之:Python 本身负责内存管理。当然,您的任务是确保可以释放对象。例如,明智的做法是不要超过必要的时间来引用大对象。例如,您可以使用del关键字来执行此操作:

foo = ... # some large object

# ...
# use foo for some tasks

del foo

# ...
# do some other tasks
Run Code Online (Sandbox Code Playgroud)

通过使用,del我们删除了foo变量,因此我们也减少了引用对象的计数器foo。因此,foo所引用的对象也可以安排删除(之前)。当然,编译器/解释器可以进行活性分析,也许会发现自己不再使用foo,但安全总比后悔好。

简而言之:Python 通过使用引用计数和垃圾收集器来管理内存本身,您需要担心的是,如果不再需要这些对象,那么没有那么多对象仍然“活着”