84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
1 一次性分配较大内存,free如何获知该内存大小并完全释放,实现机制是?
2 如下代码:
int *p = (int*)malloc(sizeof(int)); free((char*)p);
什么情况下会出现内存泄漏?
3 <c prime>一书一个版本在高级数据结构一节中写过如下代码:
<c prime>
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字节),所以,当多余的内存持续增加时,占满内存空间,就会导致内存泄漏。
这种释放方法是错误的,确定书中是这么写的吗?正确的写法应该是: