У меня есть программа 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 линии, И я могу видеть это слово даже сейчас.
Что я делаю неправильно?
Похож на 'if (root-> right == NULL && root-> left == NULL) {' только освобождает узлы без детей? –
Я вызываю эту функцию рекурсивно, поэтому она должна идти по краям, устанавливать их бесплатно, поэтому родитель теперь будет узлом, у которого нет детей, и он будет доходить до корня –
. Переменные не настраивают себя волшебным образом к 'NULL'. – tkausl