【发布时间】:2020-08-22 14:12:03
【问题描述】:
我得到了一个简单的任务——用 C 语言实现一个简单的链表结构。
我对释放分配的内存(链表和节点)的实现有一些疑问。
这些是我正在使用的结构:
typedef struct Node
{
struct Node* next;
struct Node* prev;
int* data;
int len;
} Node;
typedef struct LinkedList
{
Node* head;
Node* tail;
} LinkedList;
作为我被要求实现的整个接口的一部分,我被赋予了实现这些方法的任务:
void freeLinkedList(LinkedList *const list);
void removeNode(LinkedList *const list, Node *const node);
这些是我的实现:
void freeLinkedList(LinkedList *const list)
{
if(list == NULL)
{
fprintf(stderr,NULL_POINTER_ERROR);
return;
}
if (list-> head == NULL || list -> tail == NULL)
{
free(list);
return;
}
Node* curr = list -> tail;
while(curr != NULL)
{
Node* next = curr -> next;
free(curr -> data);
free(curr);
curr = next;
}
free(list);
}
void removeNode(LinkedList *const list, Node *const node)
{
if (node == NULL || list == NULL)
{
fprintf(stderr, NULL_POINTER_ERROR);
return;
}
if (list-> head == NULL || list -> tail == NULL)
{
fprintf(stderr, EMPTY_LINKED_LIST_ERROR);
return;
}
Node* curr = list -> tail;
while (curr != NULL)
{
if (curr == node)
{
if(node == list -> tail && node == list -> head) // Both head and tail
{
free(curr -> data);
free(curr);
list -> tail = NULL; list -> head = NULL;
return;
}
if(node == list -> tail) // Only tail
{
free(curr -> data);
list -> tail = node -> next;
free(curr);
list -> tail -> prev = NULL;
return;
}
if(node == list -> head) // Only head
{
free(curr -> data);
list -> head = node -> prev;
free(curr);
list -> head -> next = NULL;
return;
}
else
{
node -> prev -> next = node -> next;
node -> next -> prev = node -> prev;
free(curr -> data);
free(curr);
return;
}
}
curr = curr -> next;
}
fprintf(stderr, NODE_NOT_FOUND_ERROR);
}
如您所见 - 它非常简单。我开始调试一些测试,发现调用free(ptr)后指针没有变化,我猜这与函数参数中的const有关。
如何判断内存是否真的被释放了?我的实施中有明显的错误吗?很想得到一些见解。
【问题讨论】:
-
LinkedList *const list表示list不会被函数改变。实际上,释放指向list的内存 不会改变list。 -
函数
free不会改变指针的值,所以如果你看到指针的值相同,这是正确的行为 -
作为风格问题:在 C 中习惯将
list -> tail写为list->tail,即不带空格。 -
如何判断内存是否真的被释放了?没有标准的方法可以做到这一点。
-
函数内部
freeLinkedList初始化Node* curr = list -> tail;我猜你的意思是Node* curr = list -> head;