使用wxPython的python内存泄漏

2024-06-16 11:11:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近意识到,我的程序有一个内存泄漏,它很小,但不管怎样,我认为它根本不应该存在。在

导致内存泄漏的部分实际上创建了一个新的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)

注意,EditStatementunEditCondition是前面提到的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的东西


Tags: 内存selfapiaddedcountcreatewindowdict