关于C'stdlib.h中free()可能的连锁反应

时间:2012-10-21 11:38:48

标签: c

#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()函数的文档中直接提到了相同的问题。

4 个答案:

答案 0 :(得分:2)

你会有内存泄漏。仅释放s1指向的内存,而不释放s2s1->next指向的内存。所以你需要

free(s1);
free(s2);

一个好的经验法则是每freemalloc

答案 1 :(得分:2)

free你应该有一个malloc。因此,您必须单独释放s1s2。之一:

free(s1);
free(s2);

或者:

free(s1->next);
free(s1);

在第二种情况下,语句的顺序很重要,因为如果释放s1,则无法加入s1引用的objet。

  

C11(n1570),§7.22.3.3free功能
  free函数导致ptr指向的空间被释放,即可用于进一步分配。

答案 2 :(得分:1)

free函数不知道释放的内存块背后的结构。对free的调用仅释放作为其参数传递的指针所指向的块。在您的情况下,您需要先发布s1->next,然后发布s1本身:

free(s1->next);
free(s1);

答案 3 :(得分:1)

您有内存泄漏,即您丢失了指向malloc之前分配的某个内存的指针,并且不再将该指针传递给free

你应该以相反的顺序从这种性质的结构中调用free {/ 1}}。