Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用wxPython的python内存泄漏_Python_Debugging_Memory_Wxpython_Memory Leaks - Fatal编程技术网

使用wxPython的python内存泄漏

使用wxPython的python内存泄漏,python,debugging,memory,wxpython,memory-leaks,Python,Debugging,Memory,Wxpython,Memory Leaks,我最近意识到,我的程序有一个内存泄漏,它很小,但不管怎样,我认为它根本不应该存在 导致内存泄漏的部分实际上创建了一个新的wx.Panel,并使用wx.windowspliter将其添加到接口中,然后删除Panel和un 拆分窗口 self.getAction(self, event): if self.lastEdit[0] != None: if self.lastEdit[4] == STATEMENT: dialog = EditStatem

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

导致内存泄漏的部分实际上创建了一个新的
wx.Panel
,并使用
wx.windowspliter
将其添加到接口中,然后删除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
un
EditCondition
是前面提到的
wx.Panel
类别。在循环中调用
getAction()
会随机增加内存使用,最奇怪的是,在某些迭代中没有变化,在某些迭代中使用的内存甚至会下降一点,但在大多数迭代中使用的内存会增加。下面是调试的一些输出,使用
gc
模块包装器生成

用于测试的代码:

def cycler(self):
    while True:
        self.getAction(None) #Show window
        wx.YieldIfNeeded()
        self.mem() # prints memory information
        self.splitEditor(None) #Hide window
        wx.YieldIfNeeded()
        self.mem() # prints memory information             
结果如下:

正如您所看到的,已用内存正在增加,但对象计数在创建和删除后并没有改变,我只是不明白什么可能会造成这样的内存泄漏。任何想法都将不胜感激。在45分钟内,内存使用量从
~20MB
增加到
~500MB

另外,如果有人感兴趣,可在以下网址找到所创建面板的源代码:


顺便说一句,我不确定,但我倾向于认为这是wx.Python bug,它带有
wx.SplitterWindow

您是否能够创建尽可能小的完整的可运行代码来演示问题?@Fenikso不,我只是尝试过,但闪烁的面板似乎不起作用。但我深入研究了我的问题,在我看来,内存在其他线程中泄漏,这让我思考,因为我在应用程序的这一部分中不使用线程,而且我确信当时没有其他线程在运行,我唯一能想到的例外是如果wx使用线程,我对此表示怀疑,但我还没有检查。如果对象计数没有改变,我觉得wxWidgets实现中似乎有一个bug。但如果不孤立问题,可能就没有办法报告它。你的wxPython版本是什么?你试过另一个吗?
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