添加和删除动态列表时的内存泄漏
memory leak in adding and deleting dynamic list
在这件事上我真的需要你的帮助。我有这两个功能执行以下操作:
- 复制人脸结构并将其添加到人脸列表中(_face_list_entry_t)
- 复制结构指针并将其添加到指针列表 (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 *));
在初始分配分支中。
在这件事上我真的需要你的帮助。我有这两个功能执行以下操作:
- 复制人脸结构并将其添加到人脸列表中(_face_list_entry_t)
- 复制结构指针并将其添加到指针列表 (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 *));
在初始分配分支中。