我确定它没有,但也许有黑魔法,所以这是我的问题:
如果我有这样的结构:
struct mystr {
char * strp,
unsigned int foo,
};
我为它分配内存并希望稍后发布。我必须做吗
free(mystr_var->strp);
free(mystr_var);
或者是最后一行,free()
函数是否遵循指针并释放它们两个?
答案 0 :(得分:5)
不,免费不跟踪指针,你需要两行。
我通常写一个像:
这样的函数void freemystr(mystr *mystr_var)
{
if (mystr_var)
{
free(mystr_var->strp);
mystr_var->strp = NULL;
free(mystr_var);
}
}
答案 1 :(得分:4)
必须单独释放每个单独分配的内存块。 free()
只会释放指针所指向的内存块,并且不知道该内存的内容是什么。
因此,在您的情况下,您通过首先释放结构中分配的最内层内存并最终释放结构指针来正确地执行此操作。
如果您只是对结构指针执行任务,则结构内存将被释放。 char* strp
保留的内存在程序生命周期中成为内存泄漏。
答案 2 :(得分:3)
不,它没有。
这根本不是魔术,对于编译器来说它只是另一个函数调用。
问问自己如何以跟随指针的方式实现void free(void *);
,当然不会因为给出包含任何的二进制数据块而被愚弄。你不能。
答案 3 :(得分:2)
没有。它只是释放指向的块。
您需要明确释放引用的内存。您需要先执行此操作(即最有可能与分配内存的方向相反)
答案 4 :(得分:2)
没有。 free
不会对所有成员免费递归。您必须明确释放已为其分配内存的所有成员。
如果您了解如何为结构分配内存以及如何免费工作,这将不会成为问题。
struct mystr {
char * strp,
unsigned int foo,
};
当你使用malloc&分配内存时朋友们,它只为会员分配内存。
在您的情况下,一个char*
和一个unsigned int
。请注意,它不会为char*
中的数据存储分配任何内存。因此,在存储数据之前,必须再次为strp
分配内存。除非您直接指定字符串文字或仅使用指针strp
指向现有内存。
示例:强>
案例1:
struct mystr s;
s.strp = "literals"; // valid, no need to malloc
案例2:
char *p="abc";
s.strp = p; // valid, no need to malloc
在所有其他用法中,您必须在将数据存储到strp
之前为strp
分配内存。
因此,当您在struct变量上调用free
时,它只释放为strp
分配的指针,而不释放strp
指向的内存。
这只是因为free
没有关于strp
指向的位置的信息。
请注意,在上面的两个示例中,您没有释放strp
,因为您没有在那里分配任何用于将数据存储到strp
的内存。简单规则是一个免费malloc/calloc/realloc
。
答案 5 :(得分:0)
C99说,
free函数导致ptr指向的空间被释放,即可用于进一步分配。如果ptr是空指针,则不执行任何操作。否则,如果参数与calloc,malloc或realloc函数先前返回的指针不匹配,或者如果通过调用free或realloc释放了空间,则行为未定义。