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