2013-03-04 80 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