自己实现的简单dmalloc

  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);

}

猜你喜欢

转载自blog.csdn.net/whuzm08/article/details/81059839