无法从函数中释放内存
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 行下方,
我现在还能看到这个词。
我做错了什么?
有两种方法:
- 你传递给它一个指向指针的指针:
void cleanup_tree( TreeNode **root)
- 您在清理后将字段设置为 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);
}
我有一个实现树的 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 行下方,
我现在还能看到这个词。
我做错了什么?
有两种方法:
- 你传递给它一个指向指针的指针:
void cleanup_tree( TreeNode **root)
- 您在清理后将字段设置为 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);
}