gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:19:29 24 4
gpt4 key购买 nike

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

当我首先销毁树时,我在尝试释放列表节点时发生崩溃,所以我认为我应该只是释放链接列表,但我在网上找不到一个好的来源,所以我想我'我在这里问。

这是一些代码的摘录,有问题的部分是 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 是否应该独立于列表进行释放的问题的答案感兴趣。

最佳答案

省略对 destroy_tree 的调用不会释放内存。

我只看到两种可能性。要么 destroy_tree 需要针对 NULL 进行防护,要么您在其他地方出现堆损坏。盔甲像这样:

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

关于c - 如何正确释放嵌套数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55618924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com