从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);
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...