#include <stdlib.h>
struct strt;
typedef struct {
int i;
struct strt *next;
} strt;
strt *s1 = malloc(sizeof(strt));
strt *s2=s1->next = malloc(sizeof(strt));
free(s1);
现在,free(s1)
是否仅释放s1指向的块或s1 和 s1-> gt; next / s2指向的块?
我明白这一定是一个问了一千个问题,但是我
无法将这描述为搜索引擎
我在free()
函数的文档中直接提到了相同的问题。
答案 0 :(得分:2)
你会有内存泄漏。仅释放s1
指向的内存,而不释放s2
和s1->next
指向的内存。所以你需要
free(s1);
free(s2);
一个好的经验法则是每free
个malloc
。
答案 1 :(得分:2)
每free
你应该有一个malloc
。因此,您必须单独释放s1
和s2
。之一:
free(s1);
free(s2);
或者:
free(s1->next);
free(s1);
在第二种情况下,语句的顺序很重要,因为如果释放s1
,则无法加入s1
引用的objet。
C11(n1570),§7.22.3.3
free
功能
free
函数导致ptr
指向的空间被释放,即可用于进一步分配。
答案 2 :(得分:1)
free
函数不知道释放的内存块背后的结构。对free
的调用仅释放作为其参数传递的指针所指向的块。在您的情况下,您需要先发布s1->next
,然后发布s1
本身:
free(s1->next);
free(s1);
答案 3 :(得分:1)
您有内存泄漏,即您丢失了指向malloc
之前分配的某个内存的指针,并且不再将该指针传递给free
。
你应该以相反的顺序从这种性质的结构中调用free
{/ 1}}。