首页
社区
课程
招聘
[旧帖] [原创]封装的malloc,安全,有效防止内存泄漏 0.00雪花
发表于: 2010-3-21 15:40 3066

[旧帖] [原创]封装的malloc,安全,有效防止内存泄漏 0.00雪花

2010-3-21 15:40
3066

#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直播授课

收藏
免费 7
支持
分享
最新回复 (10)
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
ddddddddddd
2010-3-27 21:13
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
没啥用~~~~
2010-3-27 23:17
0
雪    币: 119
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
多线程时候 怎么办?
2010-3-27 23:23
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
真的家的额
2010-3-28 04:46
0
雪    币: 212
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
多线程时候 怎么办?
2010-3-28 12:15
0
雪    币: 124
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
这样也能获得邀请码
2010-3-31 16:51
0
雪    币: 81
活跃值: (55)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
多线程我没学过,我只是提供个思想,理论上多线程也OK啊?新手。
2010-4-1 14:57
0
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
多线程不是很容易挂么?
2010-4-1 16:57
0
雪    币: 81
活跃值: (55)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
小弟不懂!请多见谅!也许代码没用,看雪是冲着我为加入看雪而写出这代码,才给我发邀请码的
2010-4-4 17:32
0
雪    币: 1731
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
呵呵!这也行!
2010-4-5 01:32
0
游客
登录 | 注册 方可回帖
返回
//