malloc()以及free()的机制
来源:互联网 发布:游侠网络对战平台 编辑:程序博客网 时间:2024/05/16 11:16
malloc()以及free()的机制
来自bc-cn C语言论坛
事实上,仔细看一下free()的函数原型,也许也会发现似乎很神奇,free()函数非常简单,只有一个参数,只要把指向申请空间的指针传递
给free()中的参数就可以完成释放工作!这里要追踪到malloc()的申请问题了。申请的时候实际上占用的内存要比申请的大。因为超出的空间是用来记录对这块内存的管理信息。先看一下在《UNIX环境高级编程》中第七章的一段话:
大多数实现所分配的存储空间比所要求的要稍大一些,额外的空间用来记录管理信息——分配块的长度,指向下一个分配块的指针等等。这就意味着如果写过一个已分配区的尾端,则会改写后一块的管理信息。这种类型的错误是灾难性的,但是因为这种错误不会很快就暴露出来,所以也就很难发现。将指向分配块的指针向后移动也可能会改写本块的管理信息。
以上这段话已经给了我们一些信息了。malloc()申请的空间实际我觉得就是分了两个不同性质的空间。一个就是用来记录管理信息的空间,另外一个就是可用空间了。而用来记录管理信息的实际上是一个结构体。在C语言中,用结构体来记录同一个对象的不同信息是
天经地义的事!下面看看这个结构体的原型 :
int is_available; //这是一个标记?
int size; //这是实际空间的大小
};
对于size,这个是实际空间大小。这里其实我有个疑问,is_available是否是一个标记?因为我看了free()的源代码之后对这个变量感觉有点纳闷(源代码在下面分析)。这里还请大家指出!
所以,free()就是根据这个结构体的信息来释放malloc()申请的空间!而结构体的两个成员的大小我想应该是操作系统的事了。但是这里有一个问题,malloc()申请空间后返回一个指针应该是指向第二种空间,也就是可用空间!不然,如果指向管理信息空间的话,写入的内容和结构体的类型有可能不一致,或者会把管理信息屏蔽掉,那就没法释放内存空间了,所以会发生错误!(感觉自己这里说的是废话)
好了!下面看看free()的源代码,我自己分析了一下,觉得比起malloc()的源代码倒是容易简单很多。只是有个疑问,下面指出!
struct mem_control_block *free;
free = ptr - sizeof(struct mem_control_block);
free->is_available = 1;
return;
}
当然,这里可能还是有人会有疑问,为什么这样就可以释放呢??我刚才也有这个疑问。后来我想到,释放是操作系统的事,那么就free()这个源代码来看,什么也没有释放,对吧?但是它确实是确定了管理信息的那块内存的内容。所以,free()只是记录了一些信息,然后告诉操作系统那块内存可以去释放,具体怎么告诉操作系统的我不清楚,但我觉得这个已经超出了我这篇文章的讨论范围了。
那么,我之前有个错误的认识,就是认为指向那块内存的指针不管移到那块内存中的哪个位置都可以释放那块内存!但是,这是大错特错!释放是不可以释放一部分的!首先这点应该要明白。而且,从free()的源代码看,ptr只能指向可用空间的首地址,不然,减去结构体大小之后一定不是指向管理信息空间的首地址。所以,要确保指针指向可用空间的首地址!不信吗?自己可以写一个程序然后移动指向可用空间的指针,看程序会有会崩!
附:
什么是堆:堆是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,
局部堆就是用户分配的空间。堆在操作系统对进程 初始化的时候分配,
运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。
什么是栈:栈是线程独有的,保存其运行状态和局部自动变量的。
栈在线程开始的时候初始化,每个线程的栈互相独立。每个函数都有自己的栈,
栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈,就是切换SS/ESP寄存器。
栈空间不需要在高级语言里面显式的分配和释放。
所以,举个例子,如果你在函数上面定义了一个指针变量,
然后在这个函数里申请了一块内存让指针指向它。实际上,这个指针的地址是在栈上,
但是它所指向的内容却是在堆上面的!这一点要注意!
- malloc()以及free()的机制
- malloc、free机制初探
- malloc和free函数机制
- malloc与free机制探索
- 实现malloc以及free函数
- 一、malloc()和free()的基本概念以及基本用法
- malloc()和free()的基本概念以及基本用法
- malloc()和free()的基本概念以及基…
- C语言 calloc, malloc, realloc ,alloca以及 free的用法
- 对malloc calloc realloc函数以及free函数的认识
- new和malloc以及delete和free的区别
- malloc的 free
- malloc/free的原理
- malloc()/free()的实现
- malloc()/free()的实现
- malloc/free的实现
- malloc()/free()的实现
- malloc()/free()的实现
- 怎样在标题显示背景图.
- 最有效防电脑辐射方法
- 试验网站#1搜索引擎优化收录情况记录(断续运行)2007-11-7
- 试验网站#3搜索引擎优化收录情况记录2007-11-7
- 对apache dbcp的封装
- malloc()以及free()的机制
- 什么是module 以及如何写一个module
- Bad man and Bad man
- MKS8.0支持UNIX命令列表
- asp读配置文件的两种方法
- linux 下调用当前用户名
- Webcast 系列课程
- 手机刷wm6成功
- E文积累_20071107