遇到的问题:
最近在测试新客户端时,发现duilib list removeall()元素时,
内存嗖嗖的往上涨,几千条数据来回刷新,内存占用就涨到了200兆左右。
跟进duilib的源码,看list控件是怎么删除当前自己的list元素的,
然后就发现了问题
```
void CListUI::RemoveAll()
{
m_iCurSel = -1;
m_iExpandedItem = -1;
m_pList->RemoveAll();
}
```
```
void CContainerUI::RemoveAll()
{
for( int it = 0; m_bAutoDestroy && it < m_items.GetSize(); it++ ) {
if( m_bDelayedDestroy && m_pManager ) m_pManager->AddDelayedCleanup(static_cast<CControlUI*>(m_items[it]));
else static_cast<CControlUI*>(m_items[it])->Delete();
}
m_items.Empty();
NeedUpdate();
}
void CPaintManagerUI::AddDelayedCleanup(CControlUI* pControl)
{
if (pControl == NULL) return;
pControl->SetManager(this, NULL, false);
m_aDelayedCleanup.Add(pControl);
PostAsyncNotify();
}
CContainerUI::CContainerUI()
: m_iChildPadding(0),
m_iChildAlign(DT_LEFT),
m_iChildVAlign(DT_TOP),
m_bAutoDestroy(true),
m_bDelayedDestroy(true),
m_bMouseChildEnabled(true),
m_pVerticalScrollBar(NULL),
m_pHorizontalScrollBar(NULL),
m_bScrollProcess(false)
{
::ZeroMemory(&m_rcInset, sizeof(m_rcInset));
}
```
list控件也是调用自己内部的一个控件 CListBodyUI* m_pList 去删除元素,
但是m_bAutoDestroy默认是true,
也就是说list控件会异步删除插入的容器元素,
而我跟踪发现异步消息还没处理。这样就找到了list removeall 内存泄露的根本原因,
故我们可以在自己的list控件初始化中,
给CListBodyUI* m_pList的m_bDelayedDestroy变量赋值为false,
使其同步的删除list元素即可。我的调用代码如下
```
m_pList->GetList()->SetDelayedDestroy(false);
```
m_pList是我自己的list指针。如有不对,请指教。。。。
解决Duilib list控件,removeall() 时存在内存泄露的问题
最新推荐文章于 2020-12-04 09:09:54 发布