添加和删​​除动态列表时的内存泄漏

memory leak in adding and deleting dynamic list

在这件事上我真的需要你的帮助。我有这两个功能执行以下操作:

  1. 复制人脸结构并将其添加到人脸列表中(_face_list_entry_t)
  2. 复制结构指针并将其添加到指针列表 (fib_entry_t )

我创建了这两个函数来动态分配新项目(面孔和指针)并将其添加到它们的相关列表中。 (我不要删除项目的功能)

我目前正面临内存泄漏,我不确定 allocating/reallocating/freeing 中的内存是否会导致此问题。下面是两个函数:

int8_t face_list_add(_face_list_entry_t** face_list, int8_t* face_list_size, _face_list_entry_t* face)
{
    if (*face_list == NULL) {
        *face_list = malloc(sizeof(_face_list_entry_t));

        if (*face_list == NULL) {
            DEBUG("fail to allocate memory for face list\n");
            return -1;
        }

        *face_list_size = 1;
        (*face_list)[0].id   = face->id;
        (*face_list)[0].type = face->type;

        return 0;

    } else {
        // check for existing face entry
        for (int i = 0; i < *face_list_size; ++i) {
            if ((*face_list)[i].id == face->id) {
                DEBUG("wildcard: same face exists in the fib entry\n");
                return 1;
            }
        }

        // need to add a new entry to the face list
        _face_list_entry_t *list = (_face_list_entry_t*) realloc( *face_list, (*face_list_size + 1) * sizeof(_face_list_entry_t));
        DEBUG("facelist size = %d\n", (*face_list_size + 1) * sizeof(_face_list_entry_t));
        if (list == NULL) {
            DEBUG("fail to reallocate memory for face list (size=%d)\n", *face_list_size);
            return -1;
        }
        *face_list = list;
        (*face_list)[*face_list_size].id = face->id;
        (*face_list)[*face_list_size].type = face->type;
        ++(*face_list_size);
        return 0;
    }
}

int8_t pointer_list_add(fib_entry_t ***fib_list, int8_t *fib_list_size, fib_entry_t **fib)
{
    if (*fib_list == NULL) {
        *fib_list = malloc(sizeof(fib_entry_t *));
        if (!*fib_list) {
            DEBUG("fail to allocate memory for fib list\n");
            return -1;
        }
        *fib_list_size = 1;
        **fib_list = *fib;
        return 0;
    } else {
        // check for existing fib entry
        for (int i = 0; i < *fib_list_size; ++i) {
            if ((*fib_list)[i] == *fib) {
                DEBUG("same fib exists in the fib entry\n");
                return 1;
            }
        }

        // need to add a new entry to the fib list
        fib_entry_t **list = (fib_entry_t **)realloc(*fib_list, (*fib_list_size + 1) * sizeof(fib_entry_t *));
        if (!list) {
            DEBUG("fail to reallocate memory for fib list (size=%d)\n", *fib_list_size);
            return -1;
        }
        **fib_list = *list;
        (*fib_list)[*fib_list_size] = *fib;
        ++(*fib_list_size);
        return 0;
    }
}

我这样称呼他们:

res = face_list_add(&list_faces, &lst_faces_size, face);
res = pointer_list_add(&list_fibs, &list_fibs_size, &fib);

我删除了如下列表。我不想删除每个指针指向的内存,我只想删除指针列表和面列表分配的内存:

free(list_faces);
free(list_fibs);

如果我做错了或建议更好的方法(低成本)请告诉我,因为我正在使用的设备具有受限的功能、非常低的内存 (256KB) 和低处理能力,即维护记忆是至关重要的。此外,通常这两个列表都比较小,但在某些情况下会变大。

非常感谢您的帮助

给出 face_list_add()pointer_list_add() 函数以及这些(重新)分配内存的调用 ...

res = face_list_add(&list_faces, &lst_faces_size, face);
res = pointer_list_add(&list_fibs, &list_fibs_size, &fib);

,这些 free() 调用 ...

free(list_faces);
free(list_fibs);

... 对于释放这些函数分配的内存是正确的。或者他们会,如果功能是正确的。 face_list_add() 看起来没问题,但是 pointer_list_add() 的 realloc 分支有错误,这里:

        **fib_list = *list;

应该是

        *fib_list = list;

,类似于

        *fib_list = malloc(sizeof(fib_entry_t *));

在初始分配分支中。