关于库函数free p是怎样知道要删除的内存空间大小
2014-12-07 10:39
253 查看
转载:请注明出处,/article/9411730.html谢谢!
malloc、free函数
malloc是C/C++中的动态内存分配的标准库函数,函数原型:void* malloc(unsigned int size);其功能就是在堆上动态开辟内存空间,它的特点:
1、返回值为void*,(void* 类型可以强制转换为任何其它类型的指针,但反过来就不行了);
2、需要具体指定要分配空间的大小size,且size类型为无符整型;
3、它允许申请0个长度的内存(这点很有意思吧);
4、其申请到的空间逻辑上是连续的,物理上是离散的(链表形式管理)。
那么问题来了,在malloc分配了空间后,free释放空间的时候是怎么知道要free的空间的大小呢?
其实真正的内存管理如申请/释放等,并不是由malloc或者free等库函数来负责的,而是交由操作系统去完成,它们只是维护一个空闲的链表式的内存块,理解这一点是问题的关键。例如:要申请sizeof(int)*100大小的内存空间,虽然返回的是内存大小是400,但实际上,操作系统分配时候,会多出一块用于存储内存大小的类似链表head头节点的东东,这个节点存储的是空间的首地址及分配内存的大小。当用户调用free函数的时候,其实它也不知道要释放内存的大小,它只需改变head头结点里的内存的大小就可以了,具体内存空间的释放由操作系统去完成。
malloc、free函数
malloc是C/C++中的动态内存分配的标准库函数,函数原型:void* malloc(unsigned int size);其功能就是在堆上动态开辟内存空间,它的特点:
1、返回值为void*,(void* 类型可以强制转换为任何其它类型的指针,但反过来就不行了);
2、需要具体指定要分配空间的大小size,且size类型为无符整型;
3、它允许申请0个长度的内存(这点很有意思吧);
4、其申请到的空间逻辑上是连续的,物理上是离散的(链表形式管理)。
那么问题来了,在malloc分配了空间后,free释放空间的时候是怎么知道要free的空间的大小呢?
其实真正的内存管理如申请/释放等,并不是由malloc或者free等库函数来负责的,而是交由操作系统去完成,它们只是维护一个空闲的链表式的内存块,理解这一点是问题的关键。例如:要申请sizeof(int)*100大小的内存空间,虽然返回的是内存大小是400,但实际上,操作系统分配时候,会多出一块用于存储内存大小的类似链表head头节点的东东,这个节点存储的是空间的首地址及分配内存的大小。当用户调用free函数的时候,其实它也不知道要释放内存的大小,它只需改变head头结点里的内存的大小就可以了,具体内存空间的释放由操作系统去完成。
相关文章推荐
- 关于根据指针测定一块内存所占空间大小的问题
- 关于free如何知道要释放多少内存空间长度的问题
- 关于指针变量所占内存空间大小的问题
- 关于free如何知道要释放内存空间的长度问题(X86篇)
- 关于free如何知道要释放内存空间的长度问题(ARM篇)
- C++类空间大小关于内存对齐的学习
- 关于free如何知道要释放内存空间的长度问题
- 关于u-boot for MINI6410自动识别内存大小的原理
- LINUX2.6内核中用户空间向驱动程序传递的内存大小最大为多少?
- 关于设置JVM内存大小的问题
- Android获取内部和外部内存空间大小
- 关于malloc与new开辟内存空间
- 使用计算总内存大小的方法确定jvm中为对象分配的存储空间大小
- 关于结构体,联合体及内存大小的问题
- 关于u-boot for MINI6410自动识别内存大小的原理
- 计算机中内存大小单位及其关系你知道有哪些?
- 关于undo表空间大小设定的讨论
- 关于wince的内存空间布局
- 关于MFC下怎样实现内存整理功能!(详解)
- struct对象在内存中所占的空间大小(内存对齐)