无法从功能中释放内存

时间:2016-10-13 16:38:48

标签: c pointers memory-management valgrind

我有一个实现树木的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;
        }   

}

My Tree结构

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行下面, 我现在能够看到这个词。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

有两种方法:

  1. 你传给指针指针:void cleanup_tree( TreeNode **root)
  2. 清理返回后将字段设置为NULL:
  3. 目前,函数所做的更改不会反映在您传递的节点参数中。

    广告2:

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

答案 1 :(得分:0)

您似乎认为在调用函数中可以看到此函数末尾的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);
}