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