0
#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 指向的块还是释放 s1s1->next/s2 指向的块?

我知道这一定是一个被问了一千次的问题,但我无法在搜索引擎中描述这个问题,我也无法在free()函数文档中直接提到相同的问题。

4

4 回答 4

2

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

free(s1);
free(s2);

一个好的经验法则是free为每个malloc.

于 2012-10-21T11:40:22.177 回答
2

你应该有一个freeper malloc。所以你必须自由s1s2分开。任何一个:

free(s1);
free(s2);

或者:

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

在第二种情况下,语句的顺序很重要,因为您无法访问 if 引用的对象s1s1释放。

C11 (n1570), § 7.22.3.3free函数
free函数使指向的空间ptr被释放,也就是说,可用于进一步分配。

于 2012-10-21T11:41:51.977 回答
1

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

free(s1->next);
free(s1);
于 2012-10-21T11:40:52.960 回答
1

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

您应该free以相反的顺序调用mallocs这种性质的 from 结构。

于 2012-10-21T11:43:10.973 回答