我有一个小程序,它创建一个链表,其中包含二进制树的节点(指向)。当我退出程序时,我显然想要释放这个内存,我最初认为我必须释放所有树节点和树,然后才能释放链表成员,否则我会泄漏内存。这是不正确的?我是否只需要释放链表节点,并且由于它们指向二叉树,树会自动释放?
当我首先销毁树时,我试图释放列表节点时遇到崩溃,所以我假设我应该只是释放链表,但是我找不到一个好的在线源这样我所以我想在这里问。
这里是一些代码的摘录,有问题的是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);
}