c-二进制搜索树-插入时内存泄漏



我正在尝试创建一个二进制搜索树,并以迭代的方式插入一个新节点。除了我在这个函数中内存泄漏之外,一切都很好。

Valgrind说缺少7个区块(我添加了7个节点(。我看不出我的漏洞在哪里。如果能再看一眼我的代码,我将不胜感激。

void bst_insert_node(bstree* bst, unsigned long phone, char *name) {
bst_node* current = bst->root;
bst_node* parent = NULL;
bst_node* new = (bst_node *)malloc(sizeof(bst_node));
new->phone  = phone;
new->left   =   new->right  =   new->parent =   NULL;
new->name = malloc(sizeof(char) * (strlen(name)+1));
strncpy(new->name,name,(strlen(name)+1));
while(current != NULL) {
parent = current;
if(phone < current->phone) {
current = current -> left;
}
else if(phone > current->phone) {
current = current -> right;
} else {
free(new);
printf("Diese Nummer ist schon bekannt n");
return;
}
}
new->parent = parent;
if(parent == NULL) {
bst->root = new;
}
else if(new->phone < parent->phone) {
parent->left = new;
}
else {
parent->right = new;
}
}

免费方法:

void bst_free_subtree(bst_node* node) {
if (node == NULL) return;
bst_free_subtree(node->left);
bst_free_subtree(node->right);
printf("n Deleting node: %lu t %s", node->phone,node->name);
free(node);}
void bst_free_tree(bstree* bst) {
if(bst != NULL && bst->root != NULL) {
bst_free_subtree(bst->root);
bst->root = NULL;
}
}

正如我们在评论中所讨论的,内存泄漏是因为您没有释放已分配的node->name字符串。您需要在代码中再添加两个free

  • 在bst_insert_node中,如果无法在free(new)之前插入节点free(new->name)
  • 在bst_free_subtree中,free(node->name)先于free(node)

还有一个为复制的字符串分配空间的错误,如您的答案所示。只使用new->name = strdup(name)可能是最简单的,它将一次性完成分配和复制。

顺便说一句,如果这些是电话号码,那么我可能会将它们存储为字符串,而不是整数(或者如果你想全力以赴的话,可以存储libphonenumber,但C++不是C(。如果插入一个电话号码时出现问题,那么最好将错误返回给调用代码(例如,如果插入,则返回true,如果没有,则返回false(,并让它引发错误,而不是从此代码打印。

最新更新