我有一个实现树木的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行下面,
我现在能够看到这个词。
我做错了什么?
答案 0 :(得分:1)
有两种方法:
void cleanup_tree( TreeNode **root)
目前,函数所做的更改不会反映在您传递的节点参数中。
广告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);
}