内存块节点结构
typedef struct MemoryBlock{
void *data;//内存块起始地址
struct MemoryBlock *next;//下一个内存块的地址
}MemoryBlock;
内存池结构
typedef struct MemoryPool{
MemoryBlock *freeList;//空闲内存块链表
MemoryBlock *usedList;//占用内存块链表
int freeCount;//空闲内存块数量
int usedCount;//占用内存块数量
int blockCount;//内存块总数量
}MemoryPool;
MemoryPool *InitMemoryPool(int blockSize, int blockCount)
{
MemoryPool *pool = NULL;
pool = (MemoryPool *)malloc(sizeof(MemoryPool));//为内存池分配空间
pool->freeList = NULL;
pool->usedList = NULL;
for(int i = 0; i < blockCount; i++)
{
//创建内存块节点,插入到空闲链表
MemoryBlock * block = (MemoryBlock *)malloc(sizeof(MemoryBlock));
block->data = malloc(blockSize);
block->next = pool->freeList;
pool->freeList = block;
}
//初始化状态
pool->freeCount = blockCount;
pool->usedList = 0;
pool->blockCount = blockCount;
return pool;
}
void *AllocateBlock(MemoryPool *pool)
{
if(pool->freeList == NULL || pool->freeCount == 0)
return NULL;
MemoryBlock *node = pool->freeList;
//该内存块从空闲链表删除
pool->freeList = node->next;
//该内存块插入到占用链表
node->next = pool->usedList;
pool->usedList = node;
//更新空闲,占用状态
pool->usedCount++;
pool->freeCount--;
return node->data;
}
void FreeBlock(MemoryPool *pool, void *data)
{
MemoryBlock *cur = pool->usedList;
MemoryBlock *pre = NULL;
//寻找给内存块的节点
while(pre != NULL && cur->data != data)
{
pre = cur;
cur = cur->next;
}
if(cur == NULL)
return;
//将该内存块从占用链表删除
if(pre != NULL)
pre->next = cur->next;
else
pool->usedList = cur->next;
//将该内存块插入到空闲链表
cur->next = pool->freeList;
pool->freeList = cur;
pool->freeCount++;
pool->usedCount--;
return;
}
void DestroyMemoryPool(MemoryPool *pool)
{
MemoryBlock *pre = NULL;
//释放所有空闲内存块空间
while(pool->freeList != NULL)
{
pre = pool->freeList;
free(pool->freeList->data);
pool->freeList = pool->freeList->next;
free(pre);
}
//释放所有占用内存块空间
while(pool->usedList != NULL)
{
pre = pool->usedList;
free(pool->usedList->data);
pool->usedList = pool->usedList->next;
free(pre);
}
//释放内存池空间
free(pool);
pool->freeList = NULL;
pool->usedList = NULL;
pool->freeCount = 0;
pool->usedCount = 0;
return;
}
至此一个最基础的内存池算是已经完成,在实际项目中可以在此基础上进行扩展;
int main(void)
{
MemoryPool *pool;
pool = InitMemoryPool(10, 5);
int *str = (int *)AllocateBlock(pool);
*str = 2;
int *ptr = (int *)AllocateBlock(pool);
*ptr = 3;
printf("free block : %d, used block : %d\n", pool->freeCount, pool->usedCount);
FreeBlock(pool, ptr);
printf("free block : %d, used block : %d\n", pool->freeCount, pool->usedCount);
DestroyMemoryPool(pool);
return 0;
}
评论
全部评论
{{reply.username}} 回复:{{reply.replyname}}
{{reply.content}}