3 回答
TA贡献1799条经验 获得超8个赞
你可能知道你应该准确地传回你收到的指针。
因为free()最初并不知道块的大小,所以它需要辅助信息才能从其地址中识别原始块,然后将其返回到空闲列表。它还将尝试将小的释放块与邻居合并,以产生更有价值的大型空闲块。
最终,分配器必须具有关于块的元数据,至少它需要在某处存储长度。
我将描述三种方法。
一个显而易见的地方是在返回的指针之前存储它。它可以分配比请求大几个字节的块,将大小存储在第一个单词中,然后返回指向第二个单词的指针。
另一种方法是使用地址作为关键字来保持至少描述已分配块长度的单独映射。
实现可以从地址中获取一些信息,从地图中获取一些信息。4.3BSD内核分配器(我认为,称为“McKusick-Karel分配器”)为小于页面大小的对象进行二次幂分配,并且仅保持每页大小,从而使得给定页面的所有分配单一尺寸。
有些类型的第二种,可能是任何类型的第三种类型的分配器都可以实际检测到你已经提升了指针和DTRT,尽管我怀疑是否有任何实现会烧掉运行时这样做。
TA贡献2012条经验 获得超12个赞
大多数(如果不是全部)实现将查找数据量,以便在您操作的实际指针之前释放几个字节。做一个狂野free
会导致内存映射损坏。
如果你的例子,当你分配10个字节的内存时,系统实际保留,比方说,14。前4个包含你请求的数据量(10)然后返回值malloc
是指向第一个字节的指针未分配的数据在14中分配。
当你调用free
这个指针时,系统会向后查找4个字节,知道它最初分配了14个字节,因此它知道要释放多少。此系统会阻止您将要释放的数据量作为额外参数释放给free
自身。
当然,其他实现malloc
/ free
可以选择其他方式来实现这一点。但是它们通常不支持与free
指定malloc
函数返回的指针不同的指针。
- 3 回答
- 0 关注
- 428 浏览
添加回答
举报