c - valgrind没有发现内存泄漏



这段代码创建一个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的调用正是这样做的。它只接受指针的值(而不是保存指针的变量的地址)。

最新更新