www.pudn.com > 内存管理 胡一刀 .rar > MEMORY.H
//内存管理申明文件 #ifndef _MEMORY_H_ #define _MEMORY_H_ #include#include //全局变量定义 #define TOTALMEMORY 60000//数组长度 char memoryarray[TOTALMEMORY]; //链,记录空闲区或使用区 struct list { //char * firstaddress;//空闲区或使用区首地址 struct list * pre;//上一块空闲区或使用区指针, //NULL表示此空闲区或使用区为第一块空闲区或使用区 unsigned int size;//空闲区或使用区大小 struct list * next;//下一块空闲区或使用区指针, //NULL表示此空闲区或使用区为最后一块空闲区或使用区 }; struct memory { char *memorybase; //内存区首地址 long memorysize;//内存区大小 struct list * myalloclist;//使用链 struct list * myfreelist;//自由链 }; struct memory mymemory; char *myalloc(unsigned int size); void myfree(char*p); char * myalloc(unsigned int size) { struct list *tmplist; struct list *tmplist2; struct list *tmplist3; tmplist2 = mymemory.myfreelist;//初始化tmplist2 tmplist3 = mymemory.myfreelist;//初始化tmplist3 for(tmplist = mymemory.myfreelist;tmplist!=NULL;tmplist = tmplist->next) { if (size<=(tmplist->size)) //最先适应法,找到就给它 { if(size<=(tmplist->size-sizeof(struct list)))//一分为二 { tmplist2 = tmplist; tmplist =(struct list*) (tmplist+size+sizeof(struct list)); tmplist->size = tmplist2->size-size-sizeof(struct list); tmplist->next = tmplist2->next; tmplist->pre = tmplist2->pre; if(tmplist2->pre!=NULL)(tmplist2->pre)->next = tmplist; else mymemory.myfreelist = tmplist; tmplist2->size = size; printf("分到%d块内存,余下的可以划分为一块!\n",size); } else//不能分了 { if(tmplist->size==size) printf("刚好分到%d块内存!\n",size); else printf("分到%d块内存,余下的不能划分为一块!\n",size); tmplist2 = tmplist; tmplist3 = tmplist->pre; tmplist = tmplist->next; if(tmplist!=NULL) tmplist->pre = tmplist3; if(tmplist3!=NULL) tmplist3->next = tmplist; else mymemory.myfreelist = tmplist; } // 加入 mymemory.myalloclist,直接放到头就可以 tmplist3 = mymemory.myalloclist; mymemory.myalloclist = tmplist2; mymemory.myalloclist->pre = NULL; mymemory.myalloclist->next = tmplist3; if(tmplist3!=NULL) tmplist3->pre = mymemory.myalloclist; return (char*) (tmplist2 + sizeof(struct list)); } } printf("内存不够,没有分到%d块内存!\n",size); return NULL; } void myfree(char*p) { int mark1 = 0; int mark2 = 0,size; struct list *tmplist; struct list *tmplist2; struct list *tmplist3; tmplist2 = mymemory.myfreelist;//初始化tmplist2 tmplist3 = mymemory.myfreelist;//初始化tmplist3 // 首先在 mymemory.myalloclist 中去除 if(p==NULL) printf("此变量内存已经释放了,不要再释放!\n"); else{ for(tmplist = mymemory.myalloclist;tmplist!=NULL;tmplist = tmplist->next) { if(p==(char *)(tmplist+sizeof(struct list)))//在 mymemory.myalloclist找到了 { tmplist2 = tmplist; size = tmplist->size; if(tmplist->pre==NULL&&tmplist->next==NULL){mark1=1;mymemory.myalloclist=NULL;break;} else if(tmplist->pre==NULL&&tmplist->next!=NULL){mymemory.myalloclist = (mymemory.myalloclist)->next;(mymemory.myalloclist)->pre =NULL;mark1 = 1;break;} else if(tmplist->pre!=NULL&&tmplist->next==NULL){(tmplist->pre)->next=NULL;mark1 = 1;break;} else { tmplist3 = tmplist->pre; tmplist = tmplist->next; if(tmplist!=NULL) tmplist->pre = tmplist3; if(tmplist3!=NULL)tmplist3->next = tmplist; mark1 = 1;break; } } } if(mark1!=1) {printf("严重错误:不是我们给的内存不能释放!\n");} else{ mark1 = 0; // 然后放入 mymemory.myfreelist if(mymemory.myfreelist==NULL) mymemory.myfreelist = tmplist2; else{ for(tmplist = mymemory.myfreelist;tmplist!=NULL;tmplist = tmplist->next) { if(tmplist2 pre; if(tmplist3!=NULL)tmplist3->next = tmplist2; else mymemory.myfreelist = tmplist2; tmplist2->pre = tmplist3; tmplist2->next = tmplist; tmplist->pre = tmplist2; break; } } } // 再检查相临的是否需要合并 //先检查和前面的是否能合并 if(tmplist3!=NULL) { if((tmplist3+tmplist3->size+sizeof(struct list))==tmplist2) { //合并 tmplist3->size = tmplist3->size+tmplist2->size+sizeof(struct list); tmplist3->next = tmplist; tmplist->pre = tmplist3; tmplist2 = tmplist3; mark1 = 1; } } //再检查跟后面的是否能合并 if(tmplist2->next!=NULL) { if((tmplist2+tmplist2->size+sizeof(struct list))==tmplist) { //合并 tmplist2->size = tmplist2->size+sizeof(struct list)+tmplist->size; tmplist2->next = tmplist->next; if(tmplist->next!=NULL)(tmplist->next)->pre = tmplist2; mark2 = 1; } } if(mark1==0&&mark2==0) printf("释放%d块内存成功,没有合并\n",size); else if(mark1==0&&mark2==1) printf("释放%d块内存成功,释放块和他后面块合并\n",size); else if(mark1==1&&mark2==0) printf("释放%d块内存成功,释放块和他前面块合并\n",size); else printf("释放%d块内存成功,释放块和他前,后面块合并\n",size); } } } #endif