【发布时间】:2016-10-13 16:38:48
【问题描述】:
我有一个实现树的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 线下方,
即使现在我也能看到这个词。
我做错了什么?
【问题讨论】:
-
看起来
if(root->right==NULL &&root->left==NULL) {只释放没有子节点的节点? -
我正在递归调用该函数,所以它应该去边缘,将它们释放,所以父节点现在将是一个没有子节点的节点,它将上升到根节点跨度>
-
这些变量并没有神奇地将自己设置为
NULL。 -
但是我在释放它之后将一个非空的 ROOT 设置为 NULL。
-
这是一个局部变量,所以在你的函数之外是不可见的。
标签: c pointers memory-management valgrind