自己实现的简单dmalloc

写了个简单的dlmalloc的实现,这个自然是无法实用的,需要不断完善,通过简单的实例重点在于说明dlmalloc的工作原理。 

struct  tag_node{
    void *  addr;
    int size;
    char *  function;
    char * line;
    int  count;
    struct tag_node * next;
}node_t;

#define MALLOC(size)  my_malloc(size, __FUNCTION__, __LINE__)
#define FREE()      my_free()

static  node_t *  node_head;

void insert_info(void * addr, int size, char * func, int line)
{
      node_t  * cur=node_head;
      while(cur != NULL)
      {
             if(cur->func==func && cur->line==line && cur->size=size)
             {
                    cur->count++;
                    return;
             }
             cur=cur->next;
      }
    cur=(node_t *)malloc(sizeof(node_t));
    if(cur != NULL)
      {
             cur->addr=addr
             cur->size=size;
             cur->function=func;
             cur->line=line;
             cur->count=1;
             cur->next= node_head;
             node_head= cur;
      }
}

void * malloc_stat(void)
{
      node_t  * cur=node_head;
      while(cur != NULL)
      {
             printf("%s:%d:%x:%d:%d\n", cur->function, cur->line, cur->addr, cur->size, cur->count);
             cur=cur->next;
      }
}

voiddelete_info(void * addr)
{
      node_t  * cur=node_head;
      node_t  * pre=NULL;

      while(cur != NULL)
      {
             if(cur->addr == addr)
             {
                    cur->count--;
                    if(cur->count ==0)
                    {
                           if(pre == NULL)
                           {
                                  node_head=NULL;
                                  free(cur);
                           }
                           else
                           {
                                  pre->next=cur->next;
                                  free(cur);
                           }
                    }
                    return;
             }
             pre=cur;
             cur=cur->next;
      }
      printf("free fatal addr:%x\n", addr);

}

void * my_malloc(int size,char * func, int line)
{
    void * addr= malloc(size);
     if(addr != NULL)
      {
             insert_info(addr, size, fun1, line);
      }
      return addr;
}

void * my_free(void * addr)
{
      free(addr);
      delete_info(addr);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值