此代碼創建一個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的數量?
我可以告訴你,valgrind肯定不僅僅是保持「malloc」和「free」的數量。你能告訴我們你的主要功能嗎? – Xymostech 2013-03-04 23:07:22
@Xymostech見上文。 – user1505713 2013-03-04 23:16:33