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

例如:


在Ac:

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

在Bc:

 Head treeHead; treeHead = init(); 

我应该在Ac或Bc的init()方法中调用free吗?

我会在Ac中定义一个函数:

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

然后在Bc的适当位置调用它:

 freeHead(head); 

当您不再需要或需要分配的内存时,即当您完成TreeHead和TreeNode时,将调用free。 在init()释放内存是愚蠢的,因为你还没有做任何事情。

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

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

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

当我是该库的消费者时,从非标准库(即第三方代码)释放给我的记忆是没有意义的。 可能有其他内存分配给该对象,我不一定有权访问,特别是对于不透明的数据类型 。

例如,

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 */ } 

另见另一个例子 。