如何正确释放嵌套数据结构?

问题描述 投票:0回答:1

我有一个小程序,它创建一个链表,其中包含二进制树的节点(指向)。当我退出程序时,我显然想要释放这个内存,我最初认为我必须释放所有树节点和树,然后才能释放链表成员,否则我会泄漏内存。这是不正确的?我是否只需要释放链表节点,并且由于它们指向二叉树,树会自动释放?

当我首先销毁树时,我试图释放列表节点时遇到崩溃,所以我假设我应该只是释放链表,但是我找不到一个好的在线源这样我所以我想在这里问。

这里是一些代码的摘录,有问题的是destroy_list()函数,我只是想知道如果省略对destroy_tree()的调用将正确地释放我的记忆。

typedef struct listNode
{
    char* name;
    BST* customers;
    struct listNode *next;
} ListNode;

typedef struct list
{
    ListNode* head;
} List;

typedef struct bstnode
{
    long data;
    struct bstnode* left_node;
    struct bstnode* right_node;
} bstNode;

typedef struct bst
{
    bstNode* root;
} BST;

void destroy_list(List *self)
{
    ListNode* cursor = self->head;
    ListNode* prev = NULL;

    while (cursor != NULL)
    {
        prev = cursor;
        cursor = cursor->next;
        destroy_tree(prev->customers);
        free(prev);
    }
    self->head = NULL;
}

void destroy_tree_node(bstNode* self)
{
    if (self == NULL)
        return;
    destroy_tree_node(self->left_node);
    destroy_tree_node(self->right_node);
    free(self);
}

void destroy_tree(BST* self)
{
    destroy_tree_node(self->root);
    free(self);
}

谢谢你的帮助!

编辑:我刚评论出这条线,它仍然崩溃。在发布问题之前我应该​​做更多的调查,但是我会放弃它,因为我仍然有兴趣回答关于BST是否应该独立于列表而免费的问题。

c list malloc free
1个回答
0
投票

省略对destroy_tree的调用不会释放你的记忆。

我只看到两种可能性。要么destroy_tree需要装备对抗NULL,要么你在其他地方有堆腐败。盔甲是这样的:

void destroy_tree(BST* self)
{
    if (!self) return;
    destroy_tree_node(self->root);
    free(self);
}
© www.soinside.com 2019 - 2024. All rights reserved.