#include"cons.h"//包含控制台程序用到的一些头文件 typedef struct NODE { void *alloc; struct NODE *next; }Node;//使用链表记录申请的内存 static Node head; int total=0;//记录未释放的内存(malloc一次,自增,free一次,自减) static void *FreeAll(Node *p) { //递归释放p结点(包括后续结点) if(p==NULL) return NULL;//递归出口 if(p->next!=NULL) p->next=FreeAll(p->next); free(p->alloc); free(p); total-=2;//free2次,自减2 return NULL; } void *Malloc(int size) { static Node *p; static char f;//f用以标记是否初始化(仅一次初始化) if(size<=0) exit(-1); if(f==0) { p=&head; p->alloc=NULL; f=1; } //生成结点并返回 p->next=(Node *)malloc(sizeof(Node)); p=p->next; p->alloc=malloc(size); p->next=NULL; total+=2;//malloc2次,自增2 return p->alloc; } int Free(void *tmp) {//释放tmp指向的结点,p==NULL时释放全部; Node *pa,*pb; if(tmp==NULL) { FreeAll(head.next); return 0; } pa=&head; while(pa)//循环,查找结点 { pb=pa; if(pa->alloc==tmp)//找到! { free(tmp); pb->next=pa->next; free(pa);//free2次,自减2 total-=2; return 0; } pa=pa->next; } return error; } void main() { int *a; int i=0; for(i=0;i<10;i++) a=Malloc(sizeof(int));//申请十个空间 printf("有%d个空间未释放!/n",total); *a=4; Free(NULL); printf("有%d个空间未释放!/n",total); }