【问题标题】:Freeing allocated memory from a const pointer从 const 指针释放分配的内存
【发布时间】: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;

标签: c pointers free


【解决方案1】:

经过cmets的讨论,我认为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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 2021-08-07
    • 2016-07-18
    • 2017-05-07
    相关资源
    最近更新 更多