在C结构上使用free

时间:2013-04-27 17:55:23

标签: c malloc

我有一个简单的链接列表节点,如下所示

typedef struct node {
    void *data;
    struct ListElement *next;           
} node;

我还有一个节点创建和删除功能,如下所示:

void createNode(void *data){
    node *n = malloc(sizeof(node));
    //assign data to data and initialize pointer to NULL
}

void deleteNode(List *list, Node *node){
    //Take care of the next pointer
    free(node);
}

当我释放节点时,我是否还必须删除结构的成员(数据和下一个指针)?既然我没有专门为成员使用malloc,而只是为了整个结构?如果是的话那我该怎么做?是否将节点的所有成员放在堆上,并且根本不会使用堆栈?

3 个答案:

答案 0 :(得分:2)

最终规则:free() malloc() (或calloc()或...)

的完全相同的次数data

所以:

予。如果node->next指向由这些函数分配的东西,那么是的,你需要这样做。

II。 void free_list(Node *list) { while (list != NULL) { Node *p = list->next; // maybe: // free(list->data); free(list); list = p; } } 将被释放(假设你正在释放整个列表),所以无论如何你需要释放它,但只有在你处理了下一个元素之后才会释放它。

迭代解决方案:

void free_list(Node *list)
{
    if (list->next != NULL) {
        free_list(list->next);
    }

    // free(list->data);
    free(list);
}

递归解决方案:

{{1}}

答案 1 :(得分:1)

通常,您还需要free成员data,您必须在free node之前完成此操作,

free(node->data);
free(node);

但您不需要free node->next,因为要么保留列表的其余部分,要么free整个列表,然后释放下一个是在循环的下一次迭代中完成。

如果不指向已分配(带有node->data之类的内存),则不得释放malloc,但这种情况很少见。

答案 2 :(得分:1)

data不是变量,它是struct node的成员。如果通过调用struct node动态分配malloc(),则会得到足够大的内存块来容纳结构的所有成员。这显然包括data指针的存储空间,但不包括指针指向的内容的存储空间。因此,结构成员的存储不能单独释放,只需free结构即可。

但是,由于data本身就是一个指针,因此无法知道指向的内存在哪里,以及在我们看到它如何初始化之前是否需要释放这个内存。 / p>