89 lines
2.4 KiB
C
89 lines
2.4 KiB
C
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
//список о выделенной памяти
|
||
typedef struct list {
|
||
void *address;
|
||
size_t size;
|
||
char comment[64];
|
||
struct list *next;
|
||
} list;
|
||
|
||
list *memlist = NULL;
|
||
|
||
//добавление информация в однонаправленный список о новом блоке выделенной памяти
|
||
void insert(list **head, void *address, size_t size, char *comment) {
|
||
list *tmp = malloc(sizeof(list));
|
||
tmp->next = *head;
|
||
tmp->address = address;
|
||
tmp->size = size;
|
||
sprintf(tmp->comment,"%s",comment);
|
||
*head = tmp;
|
||
}
|
||
|
||
_Bool delete(list **head, void *address) {
|
||
if(*head == NULL)//если списко пустой - выходим
|
||
return 0;
|
||
list *del = NULL;
|
||
if( (*head)->address == address) {
|
||
del = *head;
|
||
*head = (*head)->next;
|
||
free(del);
|
||
return 1;
|
||
}
|
||
list *tmp = *head;
|
||
while( tmp->next ) {
|
||
if(tmp->next->address == address ) {
|
||
del = tmp->next;
|
||
tmp->next = del->next;
|
||
free(del);
|
||
return 1;
|
||
}
|
||
tmp=tmp->next;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
void printList(list *head) {
|
||
if(head == NULL) {
|
||
printf("No memory leak detect\n");
|
||
}
|
||
while(head) {
|
||
printf("%s\n",head->comment);//выводим диагностику
|
||
head = head->next;
|
||
}
|
||
}
|
||
|
||
void* my_malloc(size_t size, const char *file, int line, const char *func)
|
||
{
|
||
void *ptr = malloc(size);
|
||
char coment[64] = {0};
|
||
sprintf (coment,"Allocated = %s, %i, %s, %p[%lli]", file, line, func, ptr, size);
|
||
insert(&memlist,ptr,size,coment);
|
||
return ptr;
|
||
}
|
||
|
||
void my_free(void *ptr, const char *file, int line, const char *func)
|
||
{
|
||
delete(&memlist, ptr);
|
||
free(ptr);
|
||
}
|
||
|
||
|
||
//макрос, который заменяет стандартный вызов функции malloc() на вызов функции my_malloc() и аналогичный макрос для вызова функции free()
|
||
#define malloc(X) my_malloc( (X), __FILE__, __LINE__, __FUNCTION__)
|
||
#define free(X) my_free( (X), __FILE__, __LINE__, __FUNCTION__)
|
||
|
||
|
||
int main(void) {
|
||
int *p = malloc( sizeof(int) );//my_malloc
|
||
//~ int *p = my_malloc( sizeof(int), __FILE__, __LINE__, __FUNCTION__ );//my_malloc
|
||
int *ar = malloc(sizeof(int)*10);
|
||
*p = 5;
|
||
free(p);
|
||
p = malloc(sizeof(int));
|
||
|
||
free(p);
|
||
printList(memlist);
|
||
return 0;
|
||
}
|