尽管释放结构,但内存泄漏

brv*_*rvh 2 c memory-leaks memory-management

我遇到内存泄漏问题,我在C中构建BST并需要释放BST.我的BST_element:

typedef struct _BST_Node {
char* name;
char* public_key_file;
struct _BST_Node *left, *right;
} BST_Node;
Run Code Online (Sandbox Code Playgroud)

我的分配功能:

BST_Node* new_BSTNode(char* name, char* public_key_file) {

BST_Node* node =  malloc(sizeof(BST_Node));
node->name = malloc((strlen(name) + 1) * sizeof(char));
node->public_key_file = malloc((strlen(public_key_file) + 1) * sizeof(char));
node->left = calloc(1,sizeof(BST_Node));
node->right = calloc(1,sizeof(BST_Node));

//check if allocation was correct
if (!node || !node->name || !node->public_key_file || !node->left || !node->right) {
    printf(ALLOCATION_ERROR_MSG);
    exit(ALLOCATION_ERROR);
}

//copy strings into struct
strcpy(node->name,name);
strcpy(node->public_key_file,public_key_file);

return node;

}
Run Code Online (Sandbox Code Playgroud)

并且负责释放已分配内存的函数:

void free_BST(BST_Node**node){

//free the children:
if(!((*node)->right->name==NULL))
    free_BST(&((*node)->right));
else free((*node)->right);

if(!((*node)->left->name==NULL))
    free_BST(&((*node)->left));
else free((*node)->left);

//free strings
free((*node)->public_key_file);
free((*node)->name);

free(*node);
}
Run Code Online (Sandbox Code Playgroud)

我认为节点**不是必需的,但这是一个考试问题所以我不允许更改声明.

我的测试用例:

{
BST_Node* foo1 = new_BSTNode("hi","my");
BST_Node* foo2 = new_BSTNode("name","is");
foo1->left = foo2;
free_BST(&foo1);
}
Run Code Online (Sandbox Code Playgroud)

根据VS,内存泄漏是foo1.但是在我的析构函数中,我明确地释放了这个结构?我怎么解决这个问题?

unw*_*ind 5

除了创建新节点时,您不应该设置leftright指向任何内容NULL.

你不知道将需要哪些节点,所以总是分配它是相当糟糕的形式,这让事情变得混乱.

而是在树上插入时分配所需的子节点.