-
-
[旧帖]
[原创]封装的malloc,安全,有效防止内存泄漏
0.00雪花
-
发表于:
2010-3-21 15:40
3066
-
[旧帖] [原创]封装的malloc,安全,有效防止内存泄漏
0.00雪花
#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);
}
绝对原创,使用时直接调用Malloc/Free
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课