解决Duilib list控件,removeall() 时存在内存泄露的问题

遇到的问题:
   最近在测试新客户端时,发现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指针。如有不对,请指教。。。。 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值