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
s:
- 在 bst_insert_node 中,在您无法插入节点的情况下,
free(new->name)
在您之前free(new)
- 在 bst_free_subtree 中,
free(node->name)
在你之前free(node)
如您的答案所示,为复制的字符串分配空间时也存在一个错误。相反,它可能是最简单的new->name = strdup(name)
,它将一次性完成分配和复制。
顺便说一句,如果这些是电话号码,那么我可能会将它们存储为字符串,而不是整数(或libphonenumber,如果你想全力以赴,但 C++ 不是 C),如果插入有问题,那么它可能会更好将错误返回给调用代码(例如,如果插入则返回 true,否则返回 false)并让它引发错误,而不是从此代码中打印。
推荐阅读
- javascript - 为什么我不能从 Google AppScript for Sheets 的侧边栏中调用服务器函数?
- asp.net-mvc-3 - .Net Core 3 HtmlGrid WithFooter 不是一个选项
- c# - Using mocked objects (Moq) with methods that use reflection in C#?
- javascript - Stripe Payments not showing correctly every time
- sql - 如何在 SQL Server 中使用左外连接?
- r - Assigning numerical value to answers to calculate results in Shiny
- javascript - useSelector 或 useContext
- openssl - 使用 OpenSSL 将 .cer 和 .key 文件转换为 .pfx 文件
- python - Running Selenium on AWS Juypter Notebook Instance - Errors
- java - Spring boot starter security - missing RsaKeyConverters