这段代码创建一个BST,填充它,并努力释放资源。release()的两个版本如下所示:
typedef struct Node {
int d;
struct Node *left;
struct Node *right;
} Node;
int main() {
Node **tree = NULL;
tree = mkTree();
if (!tree) {
puts("problemn");
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);
}
二世。
/* 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's和free's的计数吗?
两个版本的Release
都在做同样的事情。一个只是有一个额外的(和不必要的)间接性水平。你可以向函数传递一个指针,然后释放这个指针;没有必要传递保存指针的变量的地址。
实际上,对free
的调用正是这样做的。它只接受指针的值(而不是保存指针的变量的地址)。