C语言 free()函数的使用规则

2025-03-31 22:22:55
推荐回答(5个)
回答1:

比如
int *a = (int*)malloc (100*sizeof(int));
int *b = a, *c = a + 10;
那么free(b) 和 free(a)是合法,他们的工作都是释放申请的a的内存100个int

再如用递归创建链表,
node* a = (node*)malloc(sizeof(node));
a->next = (node*)malloc(sizeof(node));
... ...
free(a)只释放node的申请内存,a->next不会释放,这样做会造成内存泄漏!

free的使用参考http://wenku.baidu.com/link?url=eH47ShczBTZgM0Nh_OFU081uuXzrlI-wmpkWtnMl6gh12au-mnywgc_sbUgRUZrbIrt_MxIxnSL-H0Cyz4mY0eQ-MuggKUkQlDqFMFkf32_

回答2:

根据http://www.cplusplus.com/reference/cstdlib/free/?kw=free上的解释,free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。
所以我认为,free(b)和free(a)都是合法的,但是仅仅只能调用这其中一个,此后,a和b以及c所指向的空间无意义。
而用用链表的方式来申请空间,那么free(a)只释放了a节点的空间,因为这只是一次malloc调用获得的。
注意此时释放了a,则a->next的地址会丢失,这很可能造成错误。

回答3:

free(a)当然是合法的,不然内存怎么释放呢,你是想问free(b)和free(c)是否合法吧?

b和a是同一个地址,所以free(b)和free(a)是一样合法的,但是不建议这么写
free(c)是不合法的,因为malloc申请内存时是把内存大小信息放在申请指针地址前面的,free时候会根据申请的指针找到内存大小信息从而释放内存,但是c没有通过malloc申请内存,所以c指针前面不存在这个内存大小信息,所以free(c)是非法的

回答4:

free(a)和free(b)均可以,但是只能free一次,不能free(a)之后又free(b),那样会出错的。
free(c)也不行,因为c的位置没有保存malloc时的辅助信息(用于free)

第二个问题:
free(a)就是将链表中这一个节点释放了,a->next指向的内存不会释放,但是整个a包括a->next占用的空间都已释放,a->next不能再用了。

回答5:

1、free(b) 和 free(a)当然合法,它们释放了a申请的100个int的内存,当然,两个只能执行一个

2、后面的free(a)只释放了它自己申请的node,至于a->next申请的内存则没有变化