内存池结构与接口使用说明.pdfVIP

  • 0
  • 0
  • 约2.45千字
  • 约 2页
  • 2026-01-15 发布于北京
  • 举报

内存池的结构:

(1)最基本的为内存块,用malloc函数申请,内存块前8byte用于保存内存信息,

有:本块内存的size,指向下一块内存的指针;

(2)其次为管理一组相同大小的内存块的类MemoryStack:该类功能函数有:

Malloc申请该类对象初始化的固定大小的内存,并初始化内存信息;Free外部调用释

放内存,将释放的内存管理起来;还有构造函数、析构函数初始化及摧毁内存。

该类维持两条链表,一条管理当前空闲的内存块pUsed,一条管理当前正在使用

的内存块pFree。Malloc时,如果pFree不为空,将pFree中内存移到pUsed并返

回,如果为空,则动态申请新内存,并添加到pUsed中,返回;Free时,则将

要释放的内存从pUsed移到pFree中。

(3)再外层为内存池类MemoryPool:

该类初始化时传入需要管理的不同大小的内存的类别数、每类的内存大小的数

组、每组大小内存块数的上限,内存池管理的内存总和的上限。构造函数保存传入的

参数,根据传入参数对各组内存大小进行排序,然后初始化需要的MemoryStack;

申请内存时,先按照大小查找出合适大小的MemoryStack,再调用

MemoryStack的Malloc函数申请内存;

释放时也先解析出要释放的内存的大小,对比各个MemoryStack管理的内存

块的大小,调用对应的MemoryStack对象的Free函数;

对于内存大小超过最大的MemoryStack管理大小的内存申请释放,直接动态

申请释放内存,当然,为了释放时候的Size的确定,申请的时候多申请8byte,并在

开头8byte加入内存块信息,方便释放的时候统一解析size信息。

内存池借口使用说明:

//构造函数,传入参数Number:不同尺寸大小内存的种类数,unsignedint*BlockSize表示各个

种类内存尺寸的数组,MaxNo为每类尺寸内存最大数目,MaxMemSum为最大的内存总和

CMemoryPool(unsignedintNumber,unsignedint*BlockSize,unsignedintMaxNo,

unsignedintMaxMemSum);

//析构函数

~CMemoryPool();

//从内存池申请大小为nSize的内存块

void*Malloc(unsignedintnSize);

//将从内存池申请的内存释放回内存池

boolFree(void*pPoint);

//修改当前内存大小,其中pPoint为传入的当前的内存指针,NewSize为新的内存大小,

bCopyDataFlag为保存当前内存里的数据标志,为true时保留当前数据

void*ReMalloc(void*pPoint,unsignedintNewSize,boolbCopyDataFlag);

构造函数接口说明:

(1)构造函数进行内存池的初始化工作,传入的参数有:

内存池需要管理的不同size的内存栈的种类数,每个内存栈管理大小相同的一

组内存,该参数为unsignedintNumber;

其次为与内存栈种类数对应的每种内存栈的内存块的大小,每种内存块的大小

通过数组传入,注意数组元素的个数应与前一个参数Number一致;

再然后是两个对内存池做限制的两个上限参数,一个为每个内存栈中所能管理

的内存块的数量上限,超过了该上限,该大小的内存块将不再动态申请新的内

存块,只在当前的基础上进行;

另外一个为内存池管理的内存的总和的上限,也就是所有不同大小的内存栈中

所有内存块的大小总和,总和超过上限后,也将不再新动态开辟内存,只在当

前的基础上进行

(2)申请内存函数接口Mallco():

该接口只传入一个参数,就是需要申请的内存块的大小信息;该函数如果调用

成功,也就是申请内存成功,将返回指向所申请的内存块的指针,指针类型为

(void*),如

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档