free()跟随指针吗?
我确定它没有,但也许它里面有黑魔法,所以这是我的问题:
如果我有这样的结构:
struct mystr { char * strp, unsigned int foo, };
我为它分配内存,并希望稍后发布。 我必须这样做吗?
free(mystr_var->strp); free(mystr_var);
或者是最后一行, free()
函数是否遵循指针并释放它们两个?
必须单独释放每个单独分配的内存块。 free()
只释放指针指向的内存块,并且不知道该内存的内容是什么。
因此,在您的情况下,您通过首先释放结构中分配的最内层内存并最终释放结构指针来正确地执行此操作。
如果您只是对结构指针执行自由,则结构内存将被释放。 char* strp
的内存在程序生命周期中成为内存泄漏。
不,免费不遵循指针,你需要两条线。
我经常写一个函数,如:
void freemystr(mystr *mystr_var) { if (mystr_var) { free(mystr_var->strp); mystr_var->strp = NULL; free(mystr_var); } }
不,它没有。
它根本不是魔术,对于编译器来说它只是另一个函数调用。
问自己如何实现无void free(void *);
以跟随指针的方式,当然不会被给定包含任何内容的二进制数据块所迷惑。 你不能。
不,它只是释放指向的块。
你需要明确地释放引用的内存。 您需要先执行此操作(即最有可能与分配内存的方向相反)
free
不会对所有会员免费递归。 您必须明确释放已分配内存的所有成员。
如果您了解如何为结构分配内存以及如何自由工作,这将不会成为问题。
struct mystr { char * strp, unsigned int foo, };
当你使用malloc和friends分配内存时,它只为成员分配内存。 在你的情况下,一个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
释放strp
指向的内存。 这只是因为free
没有关于strp
指向的信息。
请注意,在上面的两个示例中,您没有释放strp
因为您没有在那里分配任何用于将数据存储到strp
。 对于一个malloc/calloc/realloc
简单的规则是免费的。
C99说,
free函数导致ptr指向的空间被释放,即可用于进一步分配。 如果ptr是空指针,则不执行任何操作。 否则,如果参数与之前由calloc,malloc或realloc函数返回的指针不匹配,或者如果通过调用free或realloc释放了空间,则行为未定义。