簡體   English   中英

二進制搜索樹-插入時出現內存泄漏

[英]Binary Search Tree - Memory Leak at insertion

我正在嘗試創建一個二進制搜索樹並以迭代方式插入一個新節點。 一切正常,除非我在此功能中發生內存泄漏。

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->name)之前先free(new->name) free(new)
  • 在bst_free_subtree中, free(node->name)之前先free(node->name) free(node)

正如您的答案一樣,在為復制的字符串分配空間時也存在一個錯誤的錯誤。 取而代之的是new->name = strdup(name)可能是最簡單的,它將一次性完成分配和復制。

順便說一句 ,如果這些是電話號碼,那么我可能 會將 它們存儲為字符串,而不是整數 (如果您想整頭豬,請輸入libphonenumber ,而不是C ++,而不是C),如果插入一個電話有問題,那可能會更好將錯誤返回給調用代碼(例如,如果插入則返回true,否則返回false),並引發錯誤,而不是從該代碼打印出來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM