3

我有一个程序,它会在其中创建选项卡,每次创建一个选项卡时,内存使用量都会增加,但是当我关闭选项卡时,内存不会下降。我只是想知道,这是否正常,我能做些什么吗?这是我关闭标签的代码:

def removeTab(self, index):

  text[index].deleteLater()
  del text[index] # text box

  # reorganize dict
  last = -1
  for key in sorted(text):
    if last+1 != key:
      text[key-1] = text[key]
      del text[key]
    last += 1

  self.tab_widget.setCurrentIndex(index)
  widget = self.tab_widget.currentWidget()
  self.tab_widget.removeTab(index)  # remove tab
  widget.deleteLater()
  del widget
4

4 回答 4

2

粗略地说:

  1. python 应用程序可用的内存量可以在其生命周期内增长,但它永远不会完全缩回到它开始的地方。

  2. 没有办法强制 python 将未使用的内存释放回系统。

所以你能做的最好的就是尝试管理内存增长的数量。一种明显的方法是删除不需要的对象,以便新创建的对象可以重新使用已经分配的内存。

但是如果应用程序似乎无法重用内存怎么办?这要么意味着对象没有被干净地删除(即对它们的引用被保存在某个地方),或者更不可能的是,PyQt/Qt 中存在潜在的内存泄漏。

追踪对对象保留的额外引用有时会非常棘手(至少可以这么说)。PyQt 中一些常见的“隐藏位置”是使用 lambda(或 functools.partial)或猴子补丁保护方法连接的信号。但是没有硬性规定可以找到它们。

就目前而言,问题中的示例代码似乎没有任何地方可以“隐藏”额外的引用。因此,如果“每次”创建选项卡时内存使用量都会增加(正如 OP 声称的那样),那么问题必须出在应用程序的其他地方 - 或者更准确地说,问题可能在于对象的创建方式,而不是而不是它们被删除的方式。

于 2013-11-26T21:16:43.207 回答
1

您正在使用 python。“Del”只删除对象引用,不释放内存。负责内存释放的是垃圾收集器(而且,你无法控制它)。

如果您在其他地方保留对该对象的引用,也会发生同样的情况。

于 2013-11-24T14:45:07.843 回答
0

好的,Google Plus 上有人提出了建议。

凯文·肯尼迪 ( https://plus.google.com/u/0/105980580368438890195/posts ) 建议

“.deleteLater() 之前的.close()”。

于 2013-11-24T05:00:16.593 回答
0

一般来说,由 malloc 或 new 分配的内存在释放/删除时不会返回给系统。相反,它由应用程序保留并重用于以后的分配。如果您需要返回内存,那么您应该考虑使用自定义分配器。

于 2013-11-24T12:04:28.493 回答