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

时间:2010-12-28 07:28:16

标签: c

例如:

<小时/> 在A.c:

Head init(){
Head treeHead;
treeHead = malloc(sizeof (struct TreeHead));
treeHead->Root = malloc(sizeof (struct TreeNode));
return treeHead;}

<小时/> 在B.c:

Head treeHead;
treeHead = init();

<小时/> 我应该在A.c或B.c中的init()方法中调用free吗?

4 个答案:

答案 0 :(得分:3)

我会在A.c中定义一个函数:

void freeHead(Head head){
   free(head->Root);
   free(head);
   return;
}

然后在B.c的适当位置调用它:

freeHead(head);

答案 1 :(得分:0)

当您不再需要或需要分配的内存时,即当您完成TreeHead和TreeNode时,会调用

free。在init()中释放内存是愚蠢的,因为你还没有做任何事情。

答案 2 :(得分:0)

除了你可以在init()返回之前调用free()因为返回指针无效时,这里没有硬性规则和快速规则。

这是一个很好的例子,说明C ++如何更好地处理这类事情。如果你必须使用C,那么你可以从任何一个位置调用free(),这取决于看起来最合理的东西。

答案 3 :(得分:0)

我会将free()调用放入执行相应malloc() / calloc()调用的模块中。在您的情况下,“A.c”提供了为Head对象分配内存的函数。应该有一个相应的函数来删除先前在“A.c”中分配的内存。

当我是该库的使用者时,从非标准库(即第三方代码)释放给我的记忆是没有意义的。可能有其他内存分配给该对象,我不一定有权访问,特别是opaque data types

如,

MyType.c:

typedef struct _MyType
{
    char *name; /* fields are "private" */
    ...
} *MyType; /* opaque type "MyType" */

MyType MyType_create(void)
{
    MyType ret = malloc(sizeof *ret);
    ret->name = malloc(...);
    return ret;
}

void MyType_delete(MyType obj)
{
    free(obj->name);
    free(obj);
}

Program.c:

typedef void *MyType;

int main(void)
{
    MyType obj1 = MyType_create(); /* we have an "instance" of MyType */
    MyType_delete(obj1);           /* delete it */

    MyType obj2 = MyType_create(); /* we have an "instance" of MyType */
    free(obj2);  /* uh oh, what happened to the memory allocated for obj2->name? leak */
}

另见example