我最近意识到,我的程序有一个内存泄漏,它很小,但不管怎样,我认为它根本不应该存在。在
导致内存泄漏的部分实际上创建了一个新的wx.Panel
,并使用wx.WindowSplitter
将其添加到接口中,然后删除panel和un
拆分窗口。在
self.getAction(self, event):
if self.lastEdit[0] != None:
if self.lastEdit[4] == STATEMENT:
dialog = EditStatement(self.API.editorSplitter,
self.API, self.lastEdit, self.statementUpdateClbk)
elif self.lastEdit[4] == CONDITION:
dialog = EditCondition(self.API.editorSplitter,
self.API, self.lastEdit, self.conditionUpdateClbk)
# Show or hide split window
self.splitEditor(dialog)
def splitEditor(self, editPanel):
self.API.editorSplitter.Unsplit()
if self.lastPanel != None:
self.lastPanel.DissociateHandle()
self.lastPanel.DestroyChildren()
self.lastPanel.Destroy()
self.lastPanel = editPanel
if editPanel != None:
self.API.editorSplitter.SplitVertically(self.API.tabManager,
editPanel, -305)
注意,EditStatement
unEditCondition
是前面提到的wx.Panel
类。在循环中调用getAction()
随机增加内存使用,最奇怪的是,在某些迭代中没有变化,在某些迭代中使用的内存甚至会下降一点,但在大多数迭代中使用的内存会增长。下面是使用gc
模块包装器生成的调试输出。在
用于测试的代码:
^{pr2}$输出如下:
Window action - Action Object Count Create Window - Added StaticText 10 Create Window - Changed dict +1 Create Window - Added GridBagSizer 1 Create Window - Changed list +2 Create Window - Added CheckBox 4 Create Window - Changed ComboBox +6 Create Window - Added EditStatement 1 Create Window - Changed BoxSizer +1 Create Window - Changed instancemethod +15 Create Window - Count = 25453 Create Window - Memory(rss): 42528 Destroy Window - Changed dict -1 Destroy Window - Changed list -2 Destroy Window - Changed ComboBox -6 Destroy Window - Changed BoxSizer -1 Destroy Window - Changed instancemethod -15 Destroy Window - Deleted StaticText 10 Destroy Window - Deleted GridBagSizer 1 Destroy Window - Deleted CheckBox 4 Destroy Window - Deleted EditStatement 1 Destroy Window - Count = 25412 Destroy Window - Memory(rss): 42528 Create Window - Added StaticText 10 Create Window - Changed dict +1 Create Window - Added GridBagSizer 1 Create Window - Changed list +2 Create Window - Added CheckBox 4 Create Window - Changed ComboBox +6 Create Window - Added EditStatement 1 Create Window - Changed BoxSizer +1 Create Window - Changed instancemethod +15 Create Window - Count = 25453 Create Window - Memory(rss): 42536 Destroy Window - Changed dict -1 Destroy Window - Changed list -2 Destroy Window - Changed ComboBox -6 Destroy Window - Changed BoxSizer -1 Destroy Window - Changed instancemethod -15 Destroy Window - Deleted StaticText 10 Destroy Window - Deleted GridBagSizer 1 Destroy Window - Deleted CheckBox 4 Destroy Window - Deleted EditStatement 1 Destroy Window - Count = 25412 Destroy Window - Memory(rss): 42540 Create Window - Added StaticText 10 Create Window - Changed dict +1 Create Window - Added GridBagSizer 1 Create Window - Changed list +2 Create Window - Added CheckBox 4 Create Window - Changed ComboBox +6 Create Window - Added EditStatement 1 Create Window - Changed BoxSizer +1 Create Window - Changed instancemethod +15 Create Window - Count = 25453 Create Window - Memory(rss): 42552 Destroy Window - Changed dict -1 Destroy Window - Changed list -2 Destroy Window - Changed ComboBox -6 Destroy Window - Changed BoxSizer -1 Destroy Window - Changed instancemethod -15 Destroy Window - Deleted StaticText 10 Destroy Window - Deleted GridBagSizer 1 Destroy Window - Deleted CheckBox 4 Destroy Window - Deleted EditStatement 1 Destroy Window - Count = 25412 Destroy Window - Memory(rss): 42556 Create Window - Added StaticText 10 Create Window - Changed dict +1 Create Window - Added GridBagSizer 1 Create Window - Changed list +2 Create Window - Added CheckBox 4 Create Window - Changed ComboBox +6 Create Window - Added EditStatement 1 Create Window - Changed BoxSizer +1 Create Window - Changed instancemethod +15 Create Window - Count = 25453 Create Window - Memory(rss): 42576
正如您所看到的,使用的内存在增加,但是对象计数在创建和删除之后并没有改变,我只是不明白是什么可能造成这样的内存泄漏。任何想法都将不胜感激。在45分钟内,内存使用量从~ 20 MB
增长到{
如果有人感兴趣,可以在以下位置找到创建面板的源代码:EditStatementEditCondition
另外,我不确定,但我倾向于认为wx.Pythonbug,有wx.SplitterWindow
的东西
目前没有回答
相关问题 更多 >
编程相关推荐