无法从函数中释放内存

Not able to free memory from function

我有一个实现树的 C 程序。我的清理函数如下所示:

void cleanup_tree( TreeNode* root ){
        printf("Called\n");
        if(root->left!=NULL){
                cleanup_tree(root->left);

        }   

        if(root->right!= NULL){
                cleanup_tree(root->right);
        }   

        if(root->right==NULL &&root->left==NULL) {
                /*free(root);*/
                free(root->word);
                free(root);
                root = NULL;
        }   

}

我的树结构有

typedef struct TreeNode_st {
    char *word;                   // the word held in this node
    unsigned int frequency;       // how many times it has been seen
    struct TreeNode_st *left;     // node's left child
    struct TreeNode_st *right;    // node's right child
} TreeNode;

我正在像这样初始化一棵树:

TreeNode* initTreeNode(){
        TreeNode *mainNode=     (TreeNode*)malloc(sizeof(TreeNode));
        mainNode->frequency = 0 ;
        mainNode->word = NULL;
        mainNode->left = NULL;
        mainNode->right = NULL;
        return mainNode;

}

在我的 main 中,我调用了

TreeNode *mainNode =initTreeNode();

我正在对其进行操作,就在程序退出之前,我调用了

cleanup_tree(mainNode);

Valgrind 报告内存泄漏,所以只是为了测试,我做了 我放
printf("~~~FINAL NULL TEST %s",mainNode->left->right->word); 在我的 cleanup_tree 行下方, 我现在还能看到这个词。

我做错了什么?

有两种方法:

  1. 你传递给它一个指向指针的指针:void cleanup_tree( TreeNode **root)
  2. 您在清理后将字段设置为 NULL returns:

目前,函数所做的更改不会反映在您传递的节点参数中。

广告 2:

cleanup_tree(root->right);
root->right= NULL;

您似乎认为在此函数末尾设置 root = NULL 将在调用函数中可见,以便调用第三个 if 块。不是这样的。

您希望始终 free() word 以及节点本身。

void cleanup_tree( TreeNode* root ){
        printf("Called\n");
        if(root->left!=NULL){
                cleanup_tree(root->left);
        }   

        if(root->right!= NULL){
                cleanup_tree(root->right);
        }   
        free(root->word);
        free(root);
}