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

时间:2010-12-28 07:52:33

标签: c

  

可能重复:
  Where should I call Free() function?

我用的时候 “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

2 个答案:

答案 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);
}