[英]memory leak despite freeing struct
我遇到内存泄漏的麻烦,我正在C语言中构造一个BST,需要释放一个BST。 我的BST_element:
typedef struct _BST_Node {
char* name;
char* public_key_file;
struct _BST_Node *left, *right;
} BST_Node;
我的分配功能:
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;
}
负责释放分配的内存的函数:
void free_BST(BST_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);
}
我认为节点**不是必需的,但这是一个考试问题,因此不允许更改声明。
我的测试用例:
{
BST_Node* foo1 = new_BSTNode("hi","my");
BST_Node* foo2 = new_BSTNode("name","is");
foo1->left = foo2;
free_BST(&foo1);
}
根据VS,内存泄漏为foo1。 但是在我的析构函数中,我明确释放了这个结构吗? 我该如何解决?
创建新节点时,不应将left
指针和right
指针设置为NULL
任何NULL
。
您不知道将需要哪些节点,因此始终分配是一种很糟糕的形式,这会使事情变得混乱。
而是在树上进行插入时分配所需的子节点。
自由操作存在几个问题。
例如,假设“当前”节点位于节点链的最右端。
那么条件将是:
currentNode->name != NULL
currentNode->public_key_file != NULL
currentNode->right = NULL
currentNode->left != NULL
free_BST()函数的第一行询问:
is the currentNode->right->name != NULL
但是,由于currentNode-> right为NULL,因此它将访问内存中的某个非常低的地址。 一个与节点链无关的地址!
由于该地址位于非常低的内存中,因此很有可能读取该地址会触发段故障事件。
对于代码中的此特定问题,建议仅查看
if( NULL != currentNode->right )
then
free name,
free public_key_file,
free currentNode
在节点上向左移动时,存在类似的问题
换句话说,请勿访问除当前节点以外的任何内容中的数据字段,因为该“其他”节点可能不存在
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.