如何解决从const指针释放分配的内存
给我一个简单的任务-用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
有关。>
如何确定内存是否真正释放?我的实施过程中是否存在明显的错误?很想获得一些见识。
解决方法
在评论中进行讨论之后,我认为freeLinkedList
可以实现为:
void freeLinkedList(LinkedList *const list)
{
if (list == NULL) return;
Node* curr = list->head;
while(curr != NULL)
{
Node* next = curr->next;
free(curr->data);
free(curr);
curr = next;
}
free(list);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。