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

时间:2018-12-18 15:26:00

标签: c binary-tree binary-search-tree

我正在尝试创建一个二叉搜索树并以迭代方式插入一个新节点。一切正常,除非我在此功能中发生内存泄漏。

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;
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

如您的答案一样,在为复制的字符串分配空间时也会出现一次错误的错误。相反,仅new->name = strdup(name)可能最简单,它将一次性完成分配和复制。

顺便说一句,如果这些是电话号码,那么I'd probably store them as strings, not integers(或者libphonenumber如果您想全力以赴,但C ++不是C),并且如果插入一个电话有问题,则可能是最好将错误返回给调用代码(例如,如果插入则返回true,如果未插入则返回false),并让它引发错误而不是从该代码中打印出来。