>我在 C 语言中有一个链表,我需要通过请求销毁它并保持内存分配
这是代码:
有人可以向我解释我到底需要使用参数 dealloc 添加什么吗?
/** Destroy and de-allocate the memory hold by a list
param list - a pointer to an existing list
param dealloc flag that indicates whether stored data should also be de-allocated
*/
void dbllist_destroy(dbllist_t *list,dbllist_destroy_t dealloc)
{
dbllist_node_t *current = (dbllist_node_t *)malloc(sizeof(dbllist_node_t));
dbllist_node_t *current = (dbllist_node_t *)malloc(sizeof(dbllist_node_t));
if(current == NULL || temp == NULL)
return -1;
current = dbllist_tail(list);
while (current != NULL)
{
temp = dbllist_prev(current);
free(current);
current = temp;
dbllist_size(list)--;
}
free(current);
free(temp);
free(list);
return 0;
}
typedef enum { DBLLIST_LEAVE_DATA = 0, DBLLIST_FREE_DATA } dbllist_destroy_t;
所以,我可以看到剩余的问题:
- 顶部的双马洛克 - 所有这些都会浪费内存。没有必要在这里分配任何东西。
-
dbllist_size(list)--
是没有意义的。 你只是得到一个值,然后减少它。大概您正在尝试减小列表的存储大小。任一dbllist_size都会返回指向大小的指针(不太可能,但在这种情况下,您需要执行(*dbllist_size(list))--)
)。更有可能的是,您需要调用dbllist_set_size
(如果有的话)或(很可能)直接更改大小值(list->size--
或类似的东西)。但是,由于您正在解除分配整个结构,因此您可以在末尾将大小设置为 0^1 - 您要解除分配数据的点就在中间的
free(current)
之前。可能会像if (DBLLIST_FREE_DATA==dealloc) { free(dbllist_get_data(current));}
一样(再次,取决于 api) - 不需要 for 环路之后的
free(current)
,因为此时电流必须为零。 - 在顶部检查 null 很好,但您检查了错误的东西。您应该检查
list
是否为空。 - 您尚未声明
temp
[^1]:如果需要销毁以确保线程安全,那么您可能需要在释放每个项目后设置大小;在这种情况下,您还需要在 for 循环的内部放置一个互斥锁。此外,由于这可能是一个双向链表,因此您还需要更新最后一个/下一个指针。不过,这可能对你来说是矫枉过正了。