袖珍版固定大小 内存池1(c语言)

来源:互联网 发布:java scanner读取多行 编辑:程序博客网 时间:2024/05/16 10:26

1支持内存的快速申请和释放 一共约100行代码

2 支持任意大小的固定块 一共约100行代码

3支持多线程 设计完成,还没时间做

4支持内存整理

这是预计的,现在的1也可以用,能满足我的使用要求,有时间再做的更好些吧

因为代码没带全,明天再发

这几天忘记了,补上

typedef struct BlockList{structBlockList *NextBlock;//下一个块structBlockList *ForBlock;//上一个块char*Mem;//实际的内存intFristFree;//第一个空闲块,-1表示没有空闲了intLastFree;//最后一个空闲的内存块,这两个里面存的都是空间块序号intNumberOfSpace;//记录一块有多少小空间intNumberOfBlock;// 标示这是第几个块int*FreeList;//指向空闲序号维护数组}BLOCKList,*BLOCKLIST;//小空间固定目前固定的是1024bytestruct MemStruct{int*Number[256000];//内存序号BLOCKLIST FristBlock;//记录第一个内存块};


struct BlockList MemBase;struct MemStruct MemRoot;//一个保存了序号表和第一个内存块的结构int  NewSpace(void);//获取一个新的地址bool DeleteSpace(int number);//销毁一段空间void InitMemManage(int BlockSize,int Number);//初始化一个内存池void AddNewBlock(BLOCKLIST ForBlock);//添加一个新的内存块/*初始化内存管理器*/void InitMemManage(int BlockSize,int Number){int i;MemBase.ForBlock = MemBase.NextBlock = NULL;//初始化链表指针MemBase.FristFree = 0;MemBase.LastFree = Number-1;//指向最后一个空间序号MemBase.NumberOfSpace = Number;//每个块内有多少个小空间MemBase.NumberOfBlock = 0;//块计数MemBase.Mem = new(char[Number*1024]);//申请地址,包含了指向下一个空闲地址的指针MemBase.FreeList =new(int[Number]);//下一个空闲列表for(i=0;i<Number;i++){MemBase.FreeList[i]=i+1;}MemBase.FreeList[Number-1]=-1;//修改最后一个序号MemRoot.FristBlock = &MemBase;}/*添加一个新的内存块*/void AddNewBlock(BLOCKLIST ForBlock){BLOCKLIST tmp;int i;ForBlock->NextBlock = tmp=new(struct BlockList);//申请一个新的空间tmp->ForBlock=ForBlock;//完成指针的链接tmp->NextBlock=NULL;tmp->NumberOfSpace=ForBlock->NumberOfSpace;tmp->NumberOfBlock=ForBlock->NumberOfBlock+1;tmp->Mem = new(char[tmp->NumberOfSpace*1024]);tmp->FreeList=new(int[tmp->NumberOfSpace]);for(i=0;i<tmp->NumberOfSpace;i++){tmp->FreeList[i]=i+1;}tmp->FreeList[tmp->NumberOfSpace-1]=-1;tmp->FristFree=0;tmp->LastFree=tmp->NumberOfSpace-1;}/*获取一个新的空间*/int NewSpace(void){BLOCKLIST tmp = &MemBase;int Number;//最终返回的序号//从第一个块表开始while(1){//查询是否有空if(tmp->FristFree==-1){//表示没有空闲if(tmp->NextBlock==NULL)//已经没有下一个了break;elsetmp=tmp->NextBlock;}else{//有空闲Number=tmp->NumberOfSpace*(tmp->NumberOfBlock)+tmp->FristFree;//分配了小空间,下面维护结构MemRoot.Number[Number]=(int *)(tmp->Mem + tmp->FristFree*1024);tmp->FristFree=tmp->FreeList[tmp->FristFree];//更新了第一个return Number;}}//到这里表示所有的空间都已经分配完了AddNewBlock(tmp);return NewSpace();}bool DeleteSpace(int number)//销毁空间{BLOCKLIST tmp=&MemBase;int i;if(MemRoot.Number[number]!=0){i=number/MemBase.NumberOfSpace;//取得第一个内存块号while(i!=tmp->NumberOfBlock)tmp=tmp->NextBlock;i=number%tmp->NumberOfSpace;//求取块内号tmp->FreeList[tmp->LastFree]=i;//更新尾部tmp->LastFree=i;//更新最后序号tmp->FreeList[tmp->LastFree]=-1;if(tmp->FristFree==-1)tmp->FristFree=i;MemRoot.Number[number]=0;return 0;}elsereturn 1;}
bool DeleteMemMangage(void){BLOCKLIST tmp=&MemBase;while(tmp){delete (tmp->Mem);delete (tmp->FreeList);tmp=tmp->NextBlock;}return true;}





原创粉丝点击