Malloc и free в функции рекурсии по связному списку - PullRequest
0 голосов
/ 04 июля 2019

Я знаю, что для каждого malloc должен быть free (), но в случае существующего связного списка, переданного в рекурсивную функцию для вставки нового узла в связанный список, как бы вы освободили это?Я использую valgrind, и он показывает мне, что я должен освободить malloc

Так что моя функция имеет в качестве параметров char * и указатель на список, переданный как **, я провел некоторые исследования, и это было необходимо длябыть переданным так, чтобы вставить новые узлы, даже если указатель работал только хорошо

void showDir(char *name, linkedList **list) {
    DIR *dir;
    struct dirent *entry;

    if (!(dir = opendir(name))) return;

    while ((entry = readdir(dir)) != NULL) {
        if (entry->d_type == DT_DIR) {
            char path[1024];
            if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
                continue;
            snprintf(path, sizeof(path), "%s/%s", name, entry->d_name);
            showDir(path, list);
        }
        linkedList *node = malloc(sizeof(linkedList));
        if (!node) {
            printf("Error!");
        }
        node->next = NULL;
        char filePath[1024];
        snprintf(filePath, sizeof(filePath), "%s/%s", name, entry->d_name);
        node->path = malloc(strlen(filePath) + 1);
        strcpy(node->path, filePath);
        if (*list) {
            int found = 0;
            for (linkedList *ptr = *list; ptr != NULL; ptr = ptr->next) {
                if (strcmp(ptr->path, filePath) == 0) {
                    found = 1;
                }
                if (ptr->next == NULL && found == 0) {
                    ptr->next = node;
                    break;
                }
            }
        } else {
            *list = node;
        }
    }
    closedir(dir);
}

Я вызываю рекурсивную функцию вот так showDir(ptr->path, &list); и освобождаю ее вот так

linkedList *ptr = list;
    while (ptr != NULL) {
        linkedList *next = ptr->next;
        free(ptr->path);
        free(ptr);
        ptr = next;
    }

Конечно, список, переданный при первоначальном вызове, уже заполнен!

Спасибо за прочтение и надеюсь, что вы можете помочь понять, что я делаю здесь неправильно!

--EDIT

==1914== 64 (24 direct, 40 indirect) bytes in 1 blocks are definitely lost in loss record 2 of 14
==1914==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1914==    by 0x10A633: showDir(filestat.c:512)
==1914==    by 0x10A629: showDir(filestat.c:510)
==1914==    by 0x10A629: showDir(filestat.c:510)
==1914==    by 0x109581: main (filestat.c:186)

1 Ответ

0 голосов
/ 04 июля 2019

Создать указатель tmp.Таким образом, освобождая их, вы все равно можете перемещаться через структуру.

Если вы не создадите временный указатель на адрес структуры, вы теряете доступ к остальным узлам.

    void freeList(struct node* head)
{
   struct node* tmp;

   while (head != NULL)
    {
       tmp = head;
       head = head->next;
       free(tmp);
    }

}

C: Как освободить узлы в связанном списке?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...