写了个简单的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);
}