C 我应该在哪里调用Free()函数?

C 我应该在哪里调用Free()函数?,c,C,可能重复: 当我使用 “valgrind--泄漏检查=完全--显示可达=是。/Main” 为了检查内存泄漏,由于没有使用Free(),我出现了一些错误,但是我不知道在这个方法中在哪里可以使用Free()?如果我有空,我需要为新数据分配内存?这意味着我将删除我输入的数据???这有点傻:( 在头文件中 typedef struct TreeNode * Node; currentTree = InsearchString(currentTree,"String"); 在此.c文件中: str

可能重复:

当我使用
“valgrind--泄漏检查=完全--显示可达=是。/Main”
为了检查内存泄漏,由于没有使用Free(),我出现了一些错误,但是我不知道在这个方法中在哪里可以使用Free()?如果我有空,我需要为新数据分配内存?这意味着我将删除我输入的数据???这有点傻:(


在头文件中

typedef struct TreeNode * Node;
currentTree = InsearchString(currentTree,"String");
在此.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;}

感谢您阅读我的帖子。新年快乐:p

确切的问题在于您如何声明函数,特别是第一个参数。传递
节点的方式使
树节点
实例作为
输入/输出
参数传递;但指针本身是按值传递给函数和在
参数中被视为一个
。因此,当您试图通过调用
malloc
来修改指针的值时,修改后的值将不会传递回函数调用方。并且由于函数调用方无权访问新分配的内存,因此它将无法
释放它,并且内存块将被重新分配你会被泄露的

Valgrind检测到这一点并正确地警告您;但是,由于它不知道代码的语义,它只能告诉您需要删除函数中分配的内存块


根据预期的语义,正确的修复方法是将
节点*
节点&
传递给函数,这将允许您操作指针的原始值,而不是调用堆栈副本。

您需要创建一个递归释放函数,但当然,您只会在真正需要时才这样做你也可以删除单个的树节点,但是实现起来会稍微复杂一点

下面是当不再需要树时,应该如何释放已使用的内存

void FreeUpTree(Node root)
{
if ( root == NULL ) return;
FreeUpTree(root-Left);
FreeUpTree(root-Right);
free(root->data);
free(root);
} 

你刚刚发布了这个问题。如果问题没有解决,为什么要开始一个新的问题?@Tuan,@user552279:这只是因为你是同一个人,还是你们都发布了相同的作业?真的很怀疑有人编写了与此相同的代码,使用了valgrind,然后无法自己解释结果。这个练习很好。你会发现只有你自己思考才能学习。我写了这两个问题,但请仔细阅读,它们是不同的。在第一个问题中,我没有仔细解释一切,也找不到编辑的地方,因此我以相同的标题再次发布这篇文章,但内容不尽相同。