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

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

2010-3-21 15:40
2896
#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

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

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