WEB开发网
开发学院软件开发C++ C++内存管理变革(2):最袖珍的垃圾回收器 阅读

C++内存管理变革(2):最袖珍的垃圾回收器

 2010-10-15 09:07:47 来源:Web开发网   
核心提示:整个AutoFreeAlloc申请的内存,通过_MemBlock构成链表,C++内存管理变革(2):最袖珍的垃圾回收器(3),只要获得了链表的头,就可以遍历整个内存链,是当前_MemBlock还有足够的自由内存(free memory),即:m_end – m_begin >= cb此时,释放所有申请

整个AutoFreeAlloc申请的内存,通过_MemBlock构成链表。只要获得了链表的头,就可以遍历整个内存链,释放所有申请的内存了。而链表的头(图中标为_ChainHeader),可以通过m_begin计算得到:

_MemBlock* AutoFreeAlloc::_ChainHeader() const
{
return (_MemBlock*)(m_begin - HeaderSize);
}

为了使得_ChainHeader初始值为null,构造函数我们这样写:

AutoFreeAlloc::AutoFreeAlloc()
{
m_begin = m_end = (char*)HeaderSize;
}

★ 下面我们考虑内存分配过程。Alloc过程主要会有三种情况,具体代码为:

void* AutoFreeAlloc::Alloc(size_t cb)
{
if (m_end – m_begin < cb)
{
if (cb >= BlockSize)
{
_MemBlock* pHeader = _ChainHeader();
_MemBlock* pNew = (_MemBlock*)m_alloc.allocate(HeaderSize + cb);
if (pHeader)
{
pNew->pPrev = pHeader->pPrev;
pHeader->pPrev = pNew;
}
else
{
m_end = m_begin = pNew->buffer;
pNew->pPrev = NULL;
}
return pNew->buffer; }
else
{
_MemBlock* pNew = (_MemBlock*)malloc(sizeof(_MemBlock));
pNew->pPrev = _ChainHeader();
m_begin = pNew->buffer;
m_end = m_begin + BlockSize;
}
}
return m_end -= cb;
}

1. 最简单的情况,是当前_MemBlock还有足够的自由内存(free memory),即:

m_end – m_begin >= cb

此时,只需要将m_end前移cb字节就可以了。我们画个示意图如下:

图 3

上一页  1 2 3 4 5 6  下一页

Tags:内存 管理 变革

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接