
这里有两部分,一个是malloc,再一个是你写的代码。


再来看你写的代码,什么是你写的代码呢?以c语言为例,.c文件就是你写的代码,这包括你写的hello world程序、充满bug的练习程序,当然还有各种项目。




内存实际上和储物柜非常相似,储物柜会划分成了一个一个大小相同的隔间,每个隔间可以存储东西,内存的道理也一样,内存也被划分成了一个一个大小相同的隔间,我们来仔细看一下。




程序的运行依赖栈区,这里存放着局部变量等信息;依赖堆区,这里存放着程序员自己管理的动态申请的内存,关于堆区和栈区之前的视频也有讲解;除此之外还依赖代码区,这里保存的就是编译后的之类;还有数据区,这里保存着全局变量等信息。

这些区域在内存中的布局是这样的:


此时要分配第一块大小为A的内存,那么你应该把A放在哪里呢?

因为此时堆区是空的,显然你可以把开始这个位置划分给A,作为A的地盘,找到A的地盘后malloc这个函数返回,内存分配过程结束,是不是很简单。

接着程序员又开始申请大小为B的内存,道理和A一样,把A之后的地盘给B即可。

程序员又开始申请大小为C的内存,同理。

接着程序员说A占用的这块内存使用完毕,调用free释放,所谓释放就是把A占据的地盘重新标记为空闲,这时堆区里还有两块空闲内存。

接着程序员开始申请大小为D,这时问题来了,你该从哪里给D划分地盘呢?

放到第一个空闲块吗?显然第一个空闲块大小不够。

第二个呢,第二个也不够。

但是你发现了一个问题,仔细看着两个空闲块,这两个空闲块的总大小实际上是超过D的。

我们把这种空闲的但是不能用来分配出去的内存称之为内存碎片。

你可以想象一下经过不断的内存申请和释放,堆区中会存在无数这样空闲内存碎片。




当然这里只是一个相对简化的讲解。




