为了账号安全,请及时绑定邮箱和手机立即绑定

c中free函数的一些问题探讨

c中free函数的一些问题探讨

繁花不似锦 2019-04-08 11:17:34
1一次性分配较大内存,free如何获知该内存大小并完全释放,实现机制是?2如下代码:int*p=(int*)malloc(sizeof(int));free((char*)p);什么情况下会出现内存泄漏?3一书一个版本在高级数据结构一节中写过如下代码:while(p!=NULL){free(p);p=p->next;}这样的用法是否永远可行?
查看完整描述

2 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

(glibc的)malloc等函数在分配时会记录每块内存的起始位置和大小
看你加C++标签了,但问的问题似乎仅仅是C。在C语言中,一般是不转换malloc的返回值的类型的。通常情况下不会有问题。当char*的大小比int*小时由于整型截断,会出问题的(不是内存泄漏那么简单)。但是好像找不到这两种指针大小不一样的系统了吧?
永远不可行,因为它在逻辑上是错误的。一、另一线程可以在你访问之前使用了该内存块;二、内存分配器可以为了安全起见将已释放的内存清零;三、其它情况。
                            
查看完整回答
反对 回复 2019-04-08
?
RISEBY

TA贡献1856条经验 获得超5个赞

1和3回答的很清楚了,就补充下第二点:
C语言标准库中,free函数原型是:
voidfree(void*ptr);
C语言标准中,void*和所有指向各种数据的指针都和char*一致,包括大小,对齐方式。
所以在数据指针之间进行各种转换是没有问题的。
但是请注意:C语言标准并未规定数据指针和函数指针是一样的,这是未定义行为。
                            
查看完整回答
反对 回复 2019-04-08
  • 2 回答
  • 0 关注
  • 442 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信