84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
1 一次性分配较大内存,free如何获知该内存大小并完全释放,实现机制是?
2 如下代码:
int *p = (int*)malloc(sizeof(int)); free((char*)p);
什么情况下会出现内存泄漏?
3一书一个版本在高级数据结构一节中写过如下代码:
while(p != NULL){ free(p); p = p->next; }
这样的用法是否永远可行?
欢迎选择我的课程,让我们一起见证您的进步~~
char*
int*
1和3回答的很清楚了,就补充下第二点:C语言标准库中,free函数原型是:void free (void* ptr);C语言标准中,void*和所有指向各种数据的指针都和char *一致,包括大小,对齐方式。所以在数据指针之间进行各种转换是没有问题的。
但是请注意:C语言标准并未规定数据指针和函数指针是一样的,这是未定义行为。
malloc() 分配的内存块中包含一个头块,用来记录分配内存的大小等信息,free()会读取这个块,对内存进行释放。
头块
分配 int 类型内存大小,而只释放一半的空间(这里假设 int 为2字节),所以,当多余的内存持续增加时,占满内存空间,就会导致内存泄漏。
这种释放方法是错误的,确定书中是这么写的吗?正确的写法应该是:
for(p = head; p != NULL; p = q){ q = p->next; free(p); }
char*
的大小比int*
小时由于整型截断,会出问题的(不是内存泄漏那么简单)。但是好像找不到这两种指针大小不一样的系统了吧?1和3回答的很清楚了,就补充下第二点:
C语言标准库中,free函数原型是:
void free (void* ptr);
C语言标准中,void*和所有指向各种数据的指针都和char *一致,包括大小,对齐方式。
所以在数据指针之间进行各种转换是没有问题的。
但是请注意:C语言标准并未规定数据指针和函数指针是一样的,这是未定义行为。
malloc() 分配的内存块中包含一个
头块
,用来记录分配内存的大小等信息,free()会读取这个块,对内存进行释放。分配 int 类型内存大小,而只释放一半的空间(这里假设 int 为2字节),所以,当多余的内存持续增加时,占满内存空间,就会导致内存泄漏。
这种释放方法是错误的,确定书中是这么写的吗?正确的写法应该是: