简明分析C/C++内存分配的解决方案(5)
if(ptrChunk)
{
ptrChunk->Data = NULL;
ptrChunk->DataSize = 0;
ptrChunk->UsedSize = 0;
ptrChunk->IsAllocationChunk = false;
ptrChunk->Next = NULL;
}
return ptrChunk;
}
SMemoryChunk *CMemoryPool::FindChunkSuitableToHoldMemory(const std::size_t &sMemorySize)
{
unsigned int uiChunksToSkip = 0;
bool bContinueSearch = true;
SMemoryChunk *ptrChunk = m_ptrCursorChunk;
for(unsigned int i = 0; i < m_uiMemoryChunkCount; i++)
{
if(ptrChunk)
{
if(ptrChunk == m_ptrLastChunk)
{
ptrChunk = m_ptrFirstChunk;
}
if(ptrChunk->DataSize >= sMemorySize)
{
if(ptrChunk->UsedSize == 0)
{
m_ptrCursorChunk = ptrChunk;
return ptrChunk;
}
}
uiChunksToSkip = CalculateNeededChunks(ptrChunk->UsedSize);
if(uiChunksToSkip == 0) uiChunksToSkip = 1;
ptrChunk = SkipChunks(ptrChunk, uiChunksToSkip);
}
else
{
bContinueSearch = false
}
}
return NULL;
}
std::size_t CMemoryPool::MaxValue(const std::size_t &sValueA, const std::size_t &sValueB) const
{
if(sValueA > sValueB)
{
return sValueA;
}
return sValueB;
}
void CMemoryPool::SetMemoryChunkValues(SMemoryChunk *ptrChunk, const std::size_t &sMemBlockSize)
{
if((ptrChunk))
{
ptrChunk->UsedSize = sMemBlockSize;
}
else
{
assert(false && "Error : Invalid NULL-Pointer passed");
}
}