例如:
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吗?
答案 0 :(得分:3)
我会在A.c中定义一个函数:
void freeHead(Head head){
free(head->Root);
free(head);
return;
}
然后在B.c的适当位置调用它:
freeHead(head);
答案 1 :(得分:0)
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。