在這件事上我真的需要你的幫助。我有這兩個功能可以執行以下操作:
- 復制面結構并將其添加到面串列(_face_list_entry_t)
- 復制 struct 的指標并將其添加到指標串列 (fib_entry_t )
我創建了這兩個函式來動態分配新專案(面和指標)并將其添加到它們受尊重的串列中。(我不想要洗掉專案的功能)
我目前正面臨記憶體泄漏,我不確定分配/重新分配/釋放其中的記憶體是否會導致此問題。下面是兩個函式:
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) 和低處理能力,即維護記憶體至關重要。此外,通常,兩個串列都相對較小,但在某些情況下會變得更大。
非常感謝您的幫助
uj5u.com熱心網友回復:
鑒于呈現的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()看起來沒問題,但這里的 realloc 分支有錯誤pointer_list_add():
**fib_list = *list;
那應該是
*fib_list = list;
,類似于
*fib_list = malloc(sizeof(fib_entry_t *));
在初始分配分支中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/388331.html
上一篇:為什么remove()在使用迭代器時與if子句的行為不同?[復制]
下一篇:python-如何首先根據初始串列的單個元素將串列拆分為子串列,然后簡單地在python中將串列的連續部分拆分?
