首页 | 乐园 | 淘宝店 | 社区 | 电驴 | 网页游戏 | 网址大全

VeryCD / 社区 / 电驴软件开发

资源管理小组

相关主题

正在读取……

主题: 关于CMemPoolMgr类的一部分问题?

相关分类: VC 开源 畅所欲言

nkfeiyang (楼主) 2008/11/22 00:41:51 顶楼 举报

首先是函数void CMemPoolMgr::ProcessLog()的实现问题,我觉得用下面这个不是更好理解吗?:
原来的代码:

引用
POSITION pos2, pos1 = m_MemoryUnitList.GetHeadPosition();
for (; (pos2 = pos1) != NULL;)
{
m_MemoryUnitList.GetNext(pos1);
m_MemoryUnitList.GetAt(pos2)->ProcessLog();
}

更简单的代码:
引用
for(POSITION pos = m_MemoryUnitList.GetHeadPosition(); pos != NULL; )
{
m_MemoryUnitList.GetNext(pos)->ProcessLog();
}


然后:void CMemPoolMgr::ClearMemPoolMgr(),清除m_PoolList中的对象,这么做不是更好吗?
原来的代码:
引用
POSITION pos2, pos1 = m_PoolList.GetHeadPosition();

for (; (pos2 = pos1) != NULL;)
{
m_PoolList.GetNext(pos1);
delete m_PoolList.GetAt(pos2);
m_PoolList.RemoveAt(pos2);
}

更简单的代码:
引用
while(!m_PoolList.IsEmpty())
{
delete m_PoolList.GetHead();
m_PoolList.RemoveHead();
}

清除m_MemoryUnitList时,只做了RemoveAll()操作,为何它包含的对象不删除啊?这样不会造成类存泄露?不过我还没开始看完整的代码。今天看这个类发现了这几个地方值得改进改进

分享到开心网  分享到校内  收藏到QQ书签    订阅本主題RSS更新  美味书签

nkfeiyang (楼主) 2008/11/22 23:29:33 2楼 举报

今天又看了一点,接着贴。当然目前我所看的很肤浅,经常是只见树木不见森林,所以有时代码作者的意图不明白,故探讨探讨。
是关于CMemPool类的。

函数PMemoryBlock CMemPool::RequestBlock(unsigned int blocksize)

这个算法是否会有内存利用率不高的问题?
现假定:CMemPool申请的总内存大小为m_nPoolSize=1024k,每块为m_nBlockUnitSize=256k,这样系统就有4个PMemoryBlock,即m_MemoryUnitList有4个PMemoryBlock元素。
初始化后,m_CurUnitPos==m_MemoryUnitList.GetHeadPosition().
现在做申请内存的操作:
第一次:请求500k,则m_CurUnitPos向后移动两次
第二次,再请求500k,m_CurUnitPos继续向后移动两次,移动到了GetTailPosition(),下面的代码,是不允许m_CurUnitPos指向最后一个块

引用
if (m_CurUnitPos == m_MemoryUnitList.GetTailPosition ())
{
m_CurUnitPos = pos; // This value scroll back
return NULL;
}

这样,虽然总内存有1024k,但是申请两个500k,第二次会失败?

实际上,按照这段代码,每次申请内存后,必须保证剩余至少一个m_nBlockUnitSize大小的内存空间才算申请成功,也即1024k,只能申请到1024-256=768k。不知是不是这样的?因为我没有写代码去验证这个算法。所以有理解出错的可能。如果是这样的,为什么要保留最后一个内存块呢?


[0] [0] [回复]


返回组首页

快速回复

(?) 附件上传

关于我们 | 诚聘英才 | 著作权声明 | 合作信息 | 广告事务
沪ICP备05001009号
©2003 - 2009 VeryCD.com Some Rights Reserved.