我用的时候
“valgrind --leak-check = full --show-reachable = yes ./Main”
检查内存泄漏,我有一些错误,因为没有使用Free(),但我不知道在这个方法中我可以在哪里使用Free()?如果我免费拨打电话,我需要为新数据分配内存吗?这意味着我将删除我放入的数据???这有点傻:(
<小时/> 在头文件中
typedef struct TreeNode * Node;
在此.c文件中:
struct TreeNode {
char* theData;
Node Left;
Node Right;};
这是一个递归函数!
Node InsertString(Node tree, char* data) {
if (tree == NULL) {
tree = malloc(sizeof (struct TreeNode));//Error
if (tree == NULL) {
printf("Out of Space!\n");
} else {
tree->theData = malloc(sizeof (char) * strlen(data));//Error
strcpy(tree->theData, data);
tree->Left = tree->Right = NULL;
}
} else {
if (strcmp(data, tree->theData) < 0) {
tree->Left = InsertString(head, tree->Left, data);//Error
} else {
if (strcmp(data, tree->theData) > 0) {
tree->Right = InsertString(head, tree->Right, data);//Error
} else {
printf("This String already Existed\n");
}
}
}
}
return tree;}
<小时/> 这就是我在另一个.c文件中调用此函数的方法
currentTree = InsearchString(currentTree,"String");
感谢您阅读我的帖子。新年快乐:P
答案 0 :(得分:1)
确切的问题是因为你如何声明你的函数,特别是第一个参数。您传递Node
的方式会使TreeNode
实例作为in/out
参数传递;但指针本身通过值传递给函数,并被视为in
参数。因此,当您尝试通过调用malloc
来修改指针的值时,修改后的值将不会传递回函数调用者。由于函数调用者无法访问新分配的内存,因此无法free
它,并且内存块将被泄露。
Valgrind检测到这一点并正确警告你;但是,由于它不知道代码的语义,它只能告诉您需要删除函数中分配的内存块。
基于预期语义的正确修复是将Node *
或Node &
传递给函数,这将允许您操纵指针的原始值,而不是调用堆栈副本
答案 1 :(得分:1)
你需要创建一个递归解除分配函数,但当然你只有在你真正想要释放内存时才会这样做。你也可以删除单独的TreeNode,但实现起来会有点复杂。
以下是在不再需要树时释放已用内存的方法。
void FreeUpTree(Node root)
{
if ( root == NULL ) return;
FreeUpTree(root-Left);
FreeUpTree(root-Right);
free(root->data);
free(root);
}