【发布时间】:2016-07-27 18:55:20
【问题描述】:
作为 C 的初学者,我非常不确定何时应该免费使用。我正在研究一种从列表末尾删除元素的 pop 方法。它还应该返回被移除元素的值。
这是我的 List 和 ListNode 结构
typedef struct ListNode {
struct ListNode *next;
struct ListNode *prev;
void *value;
} ListNode;
typedef struct List {
int count;
ListNode *first;
ListNode *last;
} List;
这是我的 remove_from_back 函数的代码。
void *remove_from_back(List *list)
{
void *result = NULL;
if (list->last == NULL) return result;
result = list->last->value;
if (list->last->value == list->first->value) {
list->last = list->first = NULL;
} else {
list->last = list->last->prev;
list->last->next = NULL;
}
return result;
}
为节点创建内存的add_to_back函数
void add_to_back(List *list, void *value)
{
ListNode *node = calloc(1, sizeof(ListNode));
node->value = value;
if (list->first == NULL) {
list->first = node;
list->last = node;
} else {
list->last->next = node;
node->prev = list->last;
list->last = node;
}
list->count++;
}
【问题讨论】:
-
从不。 c 中不存在删除。也许你的意思是免费的()?
-
是的,谢谢大家,我更新了问题。 @Jens 你能扩展一下吗?如果我有一个删除节点的函数,为什么我不应该让这个函数释放我要删除的节点?
-
经验法则:如果调用者分配了内存,他们应该释放内存。如果您的容器在内部分配它,那么它应该释放内存。创建您的函数接口以完全适合这些约定之一,但不要混合使用它们。为了详细说明这一点,我将给出一个来自 C++ 的示例,其中堆栈容器管理自己的内存。为了以一种好的方式处理这个问题,
pop不返回值。它只是将其删除并释放。如果您想要弹出的值,请使用top之前调用pop。 -
@CraigEstey:不一定是泄漏,取决于分配方式。没有足够的背景来做出判断。