- 浏览: 16007 次
最新评论
关于malloc函数后free内存空间的疑问
- 博客分类:
- 技术杂绘
关于malloc函数后free内存空间的疑问
2011年11月22日
问题:
malloc是开出内存空间。
现在我写了这么一句:
char *name;
name=(char *)malloc(len*sizeof(char));
name指针是个char指针,指向一个char数据,即只保留了一个char数据的长度信息.free的时候它如何知道开出的空间到底有多长?
解答:
(1)malloc是一个库函数,不是由操作系统提供的,绝大部分都是由编译器提供的库包自己实现的。malloc如何实现,依赖于不同的操作系统跟不同的c库。
比如,在linux上面,malloc是调用brk系统调用进行内存分配的,而在windows则是HeapAlloc等等类似的系统函数分配内存。
一般c库在初始化的时候都是一下子在堆中分配了一大部分内存,然后再根据自己的算法对这些内存进行分配。至于free怎么知道要free多少字节。其实很简单,因为每用malloc分配一个内存块,c库就要记住你分配的多少字节,一般情况下都是记在返回指针的前几个字节。
(2)c库记忆就是开辟额外的空间记录分配内存的大小,开辟额外的空间去记录分配内存的大小也只是一个权宜之计,也只是c库玩的一种把戏而已。微软的c库这么做,gcc的c库这么做,但不代表其他所有编译器的c库都这么做。所以,通俗的讲,或者更一般的讲,用c库记忆更具有一般性。
(3)比如char * buf1 = (char*)malloc (32);
那么buf1[-8]~ buf1[-1] 都是用来放管理信息的!特别是在windows下编程是如此.
buf1的管理结构(8bytes) | buf1真正可操作空间(32bytes) | 下一个空闲堆的管理结构(8bytes)|两个双链表指针(8bytes)
↑ ↑
Free()根据这里提供的 buf1真正指向这里
管理信息来回收内存
发表评论
-
Microkia诞生,诺基亚的新机遇
2012-01-20 00:33 614Microkia诞生,诺基亚的新 ... -
海康威视采集卡 sdk 的包含文件问题
2012-01-20 00:33 781海康威视采集卡 sdk 的包含文件问题 2011年03月09 ... -
Andriod开发环境的搭建
2012-01-20 00:33 675Andriod开发环境的搭建 2010年12月27日 几 ... -
shell定制相关资料
2012-01-20 00:33 980shell定制相关资料 2011 ... -
Symbian^3开发环境配置
2012-01-20 00:33 628Symbian^3开发环境配置 2011年01月06日 ... -
初探Linux kernel之喝凉水系列二
2012-01-19 01:30 566初探Linux kernel之喝凉水系列二 2011年03月 ... -
D200的库设置
2012-01-19 01:30 579D200的库设置 2010年07月2 ... -
c库函数和系统调用的区别(很模糊)
2012-01-19 01:30 732c库函数和系统调用的区 ... -
系统调用、POSIX、C库、系统命令和内核函数
2012-01-19 01:30 736系统调用、POSIX、C库、 ... -
windows性能监视器常用计数器
2012-01-17 00:47 910windows性能监视器常用计 ... -
获取内存中可执行文件的PE结构--导入表
2012-01-17 00:47 1998获取内存中可执行文件的PE结构--导入表 2012年01月1 ... -
vc6.0遇见的几个问题以及解决办法
2012-01-17 00:47 1643vc6.0遇见的几个问题以及解决办法 2011年03月17日 ... -
一名计算机教师的年度教学总结(转自CSDN)
2012-01-17 00:47 732一名计算机教师的年度教学总结(转自CSDN) 2011年12 ... -
嵌入式WEB服务器BOA的移植方法(三)
2012-01-15 19:35 924嵌入式WEB服务器BOA的移 ... -
SAMSUNG S3C2440的简易BootLoader ㈢
2012-01-15 19:35 804SAMSUNG S3C2440的简易BootLoa ... -
linux C库函数(二)
2012-01-15 19:35 660linux C库函数(二) 2010年01月26日 li ... -
linux C库函数(三)
2012-01-15 19:35 679linux C库函数(三) 2010年0 ... -
meego开发的学习路线
2012-01-15 19:35 528meego开发的学习路线 2011年06月26日 不同版 ...
相关推荐
my_malloc:自己动手写的malloc函数.希望对大家了解内存管理有所帮助
C语言的malloc和free函数.pdf
在VC2008上实现malloc和free,内含注释以及图形解释
介绍malloc与free函数的用法,并利用C语言自己实现malloc与free函数,完成内存管理。
主要介绍了C语言基础之malloc和free函数详解的相关资料,需要的朋友可以参考下
谈到malloc函数相信学过c语言的人都很熟悉,但是malloc底层到底做了什么又有多少人知道。 1、关于malloc相关的几个函数 关于malloc我们进入Linux man一下就会得到如下结果: 也可以这样认为(window下)...
开辟了这块空间后,可以修改这个空间中的值,例如为*p,*(p+1)做赋值操作,如果再次使用malloc函数,例如再写一个 int *q=(int *)malloc(2*sizeof(int)); 此时开辟的以q为起始地址长度为2*sizeof
1 ,malloc 与free 是C++/C 语言的标准库函数,new/delete 是C++ 的运算符。...4 ,C++ 程序经常要调用C函数,而C 程序只能用malloc/free 管理动态内存 new 是个操作符,和什么"+","-","="……有一样的地
C语言的malloc和free函数
malloc/free只是动态分配内存空间/释放空间;new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理资源。 malloc/free需要手动计算类型大小且返回值类型为void*;new/delete可自动计算类型的大小,...
Malloc和mfree函数的实现原理,可参考
本篇文章介绍了malloc与free函数的实现代码及分析。需要的朋友参考下
大家都知道malloc可以分配一 段连续的内存空间,并且在不再使用时可以通过free释放掉。但是,许多程序员 对malloc背后的事情并不熟悉,许多人甚至把malloc当做操作系统所提供的系统 调用或C的关键字。实际上,malloc...
嵌入式系统下内存泄漏检查库函数mTrace以及测试代码,有详细使用文档.这个是将malloc和free 函数控制起来,检查内存.
my_malloc C malloc / free函数的自定义实现。
wasm-malloc WebAssembly的malloc / free的简单实现。 堆是一个双链表,如果有必要/可能,将合并或拆分块。 目前,不支持realloc。 malloc / calloc无法正确对齐内存。 由于WebAssembly MVP不支持缩小线性内存,因此...
本质是对一系列的 malloc,free 请求队列的相应,同时满足一些特定的限制条件,比如说:不可以控制用户请求空间的大小;用户的请求必须立即响应,不可以使用 buffer 的形式,这一点是和 shedlab 本质的区别;只可以...
昨日在子函数中用malloc申请内存使用后,意外发现在free的时候出现异常错误,后经检查发现原来是实际使用时指针长度超过了申请的范围。