C Связанный список valgrind Неверное чтение размера

У меня проблема с моим связанным списком и выводом valgrind. Без дополнительной информации вот мой связанный список:

typedef struct Map map;

struct Map
{
    void *address;
    double free_time;
    map* next;
}*map_list;

Список создается с использованием узла-заглушки. Как видите, структура содержит адрес и свободное время, которое я пытаюсь связать с ними.

вfind_and_free Функция Я ищу в этом списке, используя время, и если это время меньше, чем то, которое хранится в списке, я освобождаю сохраненный адрес. И затем я также освобождаю узел списка.

Эта функция используется для поиска любого свободного времени, которое меньше того, которое я передаю. Если он меньше, я освобождаю адрес, сохраненный в списке, а затем вызываюdelete_map_node функция, чтобы также освободить узел списка.

void find_and_free_address(map *root, double mtime)
{
    map *current = root->next;
    assert(current);
    while(current)
    {
        if(current->free_time < mtime)
        {

            printf("there is something to FREE now\n");
            printf("the time to check for free is %lf and the maps free time is %lf\n", mtime,current->free_time);
            printf("The map contains an address that is time to free\n");
            //free_allocated_address(&current->address);
            free(current->address);
            delete_map_node(map_list, current->free_time);
            //delete(map_list,current->free_time);
            //return next;
        }

        else
        {
            printf("there is nothing to free now\n");
        }

        current = current->next; //FIRST ERROR
    }
    printf("THE MAP SIZE AFTER REMOVALS IS %d\n", map_size(map_list));
}

И этоdelete_map_node функция

map* delete_map_node(map *root,double ftime)
{
    if (root==NULL)
    {
        return NULL;
    }

    //map *temporary;

    if (root->free_time == ftime)
    {
        map *temporary = root->next;
        free(root); //SECOND ERROR
        root = temporary;
        return temporary;
    }

    root->next = delete_map_node(root->next, ftime);
    //free(root->address);
    return root;
}

Я знаю, что эти два могут быть объединены только для одной функции.

valgrind, сообщает об отсутствии утечек памяти или неинициализированных значений. Однако, когда я выполняю следующую команду:

valgrind --tool=memcheck --leak-check=full --track-origins=yes -v ./a.out

Я получаю следующий вывод:

==6807== Invalid read of size 4
==6807==    at 0x8049228: find_and_free_address (Map.c:123)
==6807==    by 0x8048DA6: second_iteration (List.c:150)
==6807==    by 0x8048C6B: first_iteration (List.c:113)
==6807==    by 0x8048908: main (Fscanf.c:63)
==6807==  Address 0x42005bc is 12 bytes inside a block of size 16 free'd
==6807==    at 0x402AF3D: free (vg_replace_malloc.c:468)
==6807==    by 0x804929F: delete_map_node (Map.c:142)
==6807==    by 0x80492C1: delete_map_node (Map.c:147)
==6807==    by 0x8049216: find_and_free_address (Map.c:113)
==6807==    by 0x8048DA6: second_iteration (List.c:150)
==6807==    by 0x8048C6B: first_iteration (List.c:113)
==6807==    by 0x8048908: main (Fscanf.c:63)

Я вижу, что ошибка в том, что я получаю доступroot->next а такжеcurrent->next после того, как я их освободил, но мне не удалось обойтись без него.

Можете ли вы предложить мне способ, чтобы избавиться от этой ошибки?

Ответы на вопрос(1)

Ваш ответ на вопрос