代码之家  ›  专栏  ›  技术社区  ›  keser

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

  •  0
  • keser  · 技术社区  · 7 年前

    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 回复  |  直到 7 年前
        1
  •  0
  •   Rup    7 年前

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

    • 在bst_insert_节点中,如果无法插入节点, free(new->name) free(new)
    • 在bst_free_子树中, free(node->name) 在你面前 free(node)

    new->name = strdup(name) 相反,它将一次性完成分配和复制。

    I'd probably store them as strings, not integers (或 libphonenumber