关于C';stdlib.h #包括 结构strt; 类型定义结构{ int i; 结构strt*next; }strt; strt*s1=malloc(sizeof(strt)); strt*s2=s1->next=malloc(sizeof(strt)); 免费(s1);
现在,关于C';stdlib.h #包括 结构strt; 类型定义结构{ int i; 结构strt*next; }strt; strt*s1=malloc(sizeof(strt)); strt*s2=s1->next=malloc(sizeof(strt)); 免费(s1);,c,C,现在,free(s1)是仅释放s1指向的块,还是释放s1和s1->next/s2指向的块 我知道这一定是一个被问了一千遍的问题,但我 无法在搜索引擎中描述这一点,也无法 我发现在free()函数的文档中直接提到了相同的问题。您将出现内存泄漏。只有s1指向的内存被释放,而不是s2和s1->next指向的内存。所以你需要 #include <stdlib.h> struct strt; typedef struct { int i; struct strt *next;
free(s1)
是仅释放s1指向的块,还是释放s1和s1->next/s2指向的块
我知道这一定是一个被问了一千遍的问题,但我
无法在搜索引擎中描述这一点,也无法
我发现在
free()
函数的文档中直接提到了相同的问题。您将出现内存泄漏。只有s1
指向的内存被释放,而不是s2
和s1->next
指向的内存。所以你需要
#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);
一个好的经验法则是为每个
malloc
都提供一个free
,这样会导致内存泄漏。只有s1
指向的内存被释放,而不是s2
和s1->next
指向的内存。所以你需要
#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);
一个好的经验法则是为每个
malloc
都有一个free
,free
函数不知道释放的内存块背后的结构。调用free
仅释放作为其参数传递的指针指向的块。在您的情况下,您需要首先释放s1->next
,然后释放s1
本身:
free(s1);
free(s2);
free
函数不知道释放的内存块背后的结构。调用free
仅释放作为其参数传递的指针指向的块。在您的情况下,您需要首先释放s1->next
,然后释放s1
本身:
free(s1);
free(s2);
根据
malloc
,您应该有一个free
。因此,您必须分别释放s1
和s2
。要么:
free(s1->next);
free(s1);
或:
在第二种情况下,语句的顺序很重要,因为如果释放了s1
,则无法访问s1
引用的对象
C11(n1570),§7.22.3.3免费
功能free
功能使ptr
指向的空间被释放,即可供进一步分配
根据
malloc
,您应该有一个free
。因此,您必须分别释放s1
和s2
。要么:
free(s1->next);
free(s1);
或:
在第二种情况下,语句的顺序很重要,因为如果释放了s1
,则无法访问s1
引用的对象
C11(n1570),§7.22.3.3免费
功能free
功能使ptr
指向的空间被释放,即可供进一步分配
内存泄漏,即丢失了指向先前由
malloc
分配的某个内存的指针,并且不再有该指针可传递到free
您应该从这种性质的结构中以与
malloc
相反的顺序调用free
。您存在内存泄漏,即您丢失了指向先前由malloc
分配的某个内存的指针,并且不再有该指针传递到free
你应该从这种性质的结构中调用
free
,调用顺序与mallocs
相反。究竟free()
如何知道你的结构的内部结构?它只知道它是一个void*
…究竟free()
如何知道结构的内部结构?它只知道这是一个void*
…+1,引用标准并用逻辑解释的完美答案。+1,引用标准并用逻辑解释的完美答案。