- 浏览: 12179 次
最新评论
关于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真正指向这里
管理信息来回收内存
发表评论
-
Red5学习笔记(一):入门及配置
2012-01-20 10:36 845Red5学习笔记(一):入门及 ... -
FLEX 开发领域你知多少?
2012-01-20 10:36 546FLEX 开发领域你知多少? ... -
chatroulette 与RTMFP
2012-01-20 10:36 743chatroulette 与RTMFP 2010年0 ... -
使用PHP模拟RTMP客户端发送AMF消息(弹幕发射器)
2012-01-20 10:36 1187使用PHP模拟RTMP客户端发 ... -
.net 网站项目dll引用的管理问题
2012-01-20 10:36 815.net 网站项目dll引用的 ... -
GCC
2012-01-19 15:41 540GCC 2011年10月21日 The History ... -
C库函数
2012-01-19 15:41 574C库函数 2010年06月28日 rename()文件改 ... -
初探Linux kernel之喝凉水系列二
2012-01-19 15:41 604初探Linux kernel之喝凉水系列二 2011年03月 ... -
D200的库设置
2012-01-19 15:41 686D200的库设置 2010年07月2 ... -
2012-1-13
2012-01-17 05:24 4852012-1-13 2012年01月13日 2011-2 ... -
google地图API开发基础(三):控件
2012-01-17 05:23 773google地图API开发基础(三 ... -
手机党心声:“离开手机生活”这是不可能的!
2012-01-17 05:23 545手机党心声:“离开手机生活”这是不可能的! 2012年01月 ... -
Alienware新版全机型超详细全导购(升级价格/配置参考/建议分析/选配配置)!!
2012-01-17 05:23 670Alienware新版全机型超详 ... -
actually, i …
2012-01-17 05:23 543actually, i … 2012年01月13日 其实 ... -
上海老百姓的胆量 VS 大牌店营业员的势利
2012-01-16 04:18 692上海老百姓的胆量 VS 大 ... -
是谁成就了凤姐的忘形
2012-01-16 04:18 465是谁成就了凤姐的忘形 2010年06月02日 ... -
第七十三章 暗杀
2012-01-16 04:18 561第七十三章 暗杀 2011年06月10日 丰含笑又等了 ... -
看“非诚勿扰”(2011.3.27)
2012-01-16 04:18 281看“非诚勿扰”(2011.3.27 ...
相关推荐
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的时候出现异常错误,后经检查发现原来是实际使用时指针长度超过了申请的范围。