2013-03-04 77 views
1

此代碼創建一個BST,填充它,並努力釋放資源。發行()的兩個版本如下:valgrind沒有發現內存泄漏?

typedef struct Node { 
    int d; 
    struct Node *left; 
    struct Node *right; 
} Node; 


int main() { 

    Node **tree = NULL; 

    tree = mkTree(); 
    if (!tree) { 
     puts("problem\n"); 
     return 1; 
    } 

    insert(7, tree); 
    insert(3, tree); 
    insert(9, tree); 
    insert(6, tree); 

    printTree(*tree); 
    release(tree); 
    free(tree); 

    return 0; 

} 
/* Make a new binary tree */ 
    Node **mkTree() { 

    Node **t = malloc(sizeof **t); 
    return t; 
} 

/* insert datum d into tree */ 


bool insert(int d, Node **tree) { 

    Node *newptr = NULL; 

    if (tree == NULL) { /*ptr to rootptr NULL */ 
     return false; 
    } 

    if (*tree == NULL) { 
     newptr = buildNode(d); 
     if (!newptr) { 
      return false; 
     } 
     *tree = newptr; 
     return true; 
    } 

    return insert(d, d < (*tree)->d ? &(*tree)->left : &(*tree)->right); 
} 

我不明白的是爲什麼Valgrind的要求所有的資源都在這兩種情況下釋放(I和II)所示。我嘗試使用release()清除每個節點,並且在main的結尾處,我調用free(tree)來清除在main中聲明的Node **樹。

/* release resources by passing Node **tree */ 

void release(Node **tree) { 

    if (*tree) { 
     Node *here = *tree; 
     release(&here->left); 
     release(&here->right); 
    } 
    free(*tree); 

} 

II。

/* passing Node *tree. this shouldn't free anything, right? */ 

void release(Node *tree) { 

    if (tree) { 
     Node *here = tree; 
     release(here->left); 
     release(here->right); 
    } 
    free(tree); 

} 

儘管選擇,運行此程序有四個插入給人

==5182== HEAP SUMMARY: 
==5182==  in use at exit: 0 bytes in 0 blocks 
==5182== total heap usage: 5 allocs, 5 frees, 60 bytes allocated 

這裏發生了什麼? valgrind是否只保留malloc和free的數量?

+1

我可以告訴你,valgrind肯定不僅僅是保持「malloc」和「free」的數量。你能告訴我們你的主要功能嗎? – Xymostech 2013-03-04 23:07:22

+0

@Xymostech見上文。 – user1505713 2013-03-04 23:16:33

回答

2

這兩個版本的Release都在做同樣的事情。一個只是有一個額外的(和不必要的)間接程度。您可以將指針傳遞給函數並釋放該指針;沒有必要傳遞保存指針的變量的地址。

實際上,撥打free確實如此。它只接受指針值(而不是指向變量的地址)。

+0

謝謝!我的知識在這一點上似乎相當脆弱。 – user1505713 2013-03-04 23:22:23

+0

@ user1505713:指針的值是一個地址。根據需要多次複製,值不會改變。這是'免費'需要完成工作的價值。指針變量本身是一個不同的問題,就像'int'具有值和地址(實際存儲的地址)一樣。 – 2013-03-04 23:25:57