1.为什么free是void*,那么它怎么知道要释放多少内存?

《UNIX环境高级编程》

《C语言编程常见问题解答》

《你必须知道的495个C语言问题》

《UNIX环境高级编程》

2.free源码

内存控制块结构定义

struct mem_control_block {int is_available;int size;
};

可能会认为当程序调用 malloc 时这会引发问题 —— 它们如何知道这个结构?答案是它们不必知道;在返回指针之前,我们会将其移动到这个结构之后,把它隐藏起来。这使得返回的指针指向没有用于任何其他用途的内存。那样,从调用程序的角度来看,它们所得到的全部是空闲的、开放的内存。然后,当通过 free() 将该指针传递回来时,我们只需要倒退几个内存字节就可以再次找到这个结构。

  在讨论分配内存之前,我们将先讨论释放,因为它更简单。为了释放内存,我们必须要做的惟一一件事情就是,获得我们给出的指针,回退 sizeof(struct mem_control_block) 个字节,并将其标记为可用的。

解除分配函数

void free(void *firstbyte) {struct mem_control_block *mcb;
/* Backup from the given pointer to find the* mem_control_block*/mcb = firstbyte - sizeof(struct mem_control_block);
/* Mark the block as being available */mcb->is_available = 1;
/* That''s It!  We''re done. */return;
}

看一下函数第二句,这句非常重要和关键。其实这句就是把指向可用空间的指针倒回去,让它指向管理信息的那块空间,因为这里是在值上减去了一个结构体的大小!

3.查找free到底上哪儿查找需要释放的内存大小

都是指针前边的4个字节

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{void *p1,*p2,*p3,*p4,*p5,*p6;p1=malloc(10);p2=malloc(38);p3=malloc(100);p4=malloc(200);p5=malloc(106);p6=malloc(300);return 0;}

------------------------------------------

更多内容:

malloc()和free()的原理

C语言的malloc()和free()函数原理【整理】

使用_msize疏忽导致的bug

内存管理内幕

关于free如何知道要释放内存空间的长度问题(X86篇) [vs答案]

深入理解malloc和free相关推荐

  1. 自己动手实现一个malloc内存分配器 | 30图

    对内存分配器透彻理解是编程高手的标志之一. 如果你不能理解malloc之类内存分配器实现原理的话,那你可能写不出高性能程序,写不出高性能程序就很难参与核心项目,参与不了核心项目那么很难升职加薪,很难升 ...

  2. 日本程序开发式自定义的malloc/free函数(一)-外部式样书(外部仕様書)

    本文章绝大部分通过日文编写,适当的地方会以中文标注. 本人还是在校学生,有不好的地方请见谅. 请需要参考本文的小伙伴不要无脑得直接复制了得,我希望你们能理解malloc的原理以后再来看本文.(如果你真 ...

  3. C语言:内存的分配与管理

    1.内存区域的划分标准: 代码段             存储代码 数据段             静态/全局数据.常量(const)      堆区(heap)           动态内存分配(更 ...

  4. C++数据结构之单链表(henu.hjy)

    注重于程序健壮性的单链表,在学习单链表是我的方法是画图,当你理解所学,在写代码时画图是帮你梳理思路的一个很好方法 一下是我的代码,仅供参考,我写的有配套的实验报告--对于代码的解释以及一些我在学习中出 ...

  5. Netty面试题(史上最全)

    文章很长5万字,而且不断更新,建议收藏起来慢慢读!疯狂创客圈总目录 语雀版 | 总目录 码云版| 总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 经典图书:<Java高并发核心编程(卷1 ...

  6. C语言88案例,经典案例带你绝对入门C编程!

    链接可以下载完整代码和文档[C语言88案例] C语言经典88案例打包下载地址 链接: www.keketec.club/posts/c065dba1/ 案例ex01: 将字符串转换为一个整数 1 题目 ...

  7. Cu 大彻大悟内存管理 mm (update 0410)

    66 2012-4-10 11:23:53 一口气读完,畅快..原来站在设计者的角度是这样的   来源于cu 讨论 创意 ARM在内存管理上,和x86的区别主要是页表构造不同. 除了用层的思想,用映射 ...

  8. 关于C/C++ 一些自己遇到的问题以及解惑

    文章目录 1.数组越界造成的死循环 2.int main(int argc,char* argv[])里面的参数有什么作用? 3.程序代码区.文字常量区.静态区(全局区).堆区.栈区 4.函数指针 指 ...

  9. 《深入理解计算机系统》(CSAPP)实验七 —— Malloc Lab

    文章目录 隐式空闲链表 分离的空闲链表 显示空闲链表 1. 实验目的 2. 背景知识 3. Implicit list mm_init extend_heap mm_malloc find_fit p ...

最新文章

  1. 【分享】bootstrap学习笔记
  2. opencv 图像分割 阈值分割 图像二值化 灰度图
  3. Boost:opencv卷积的测试程序
  4. vscode 配置php
  5. 如何下载SAP Cloud for Customer UI技术模型的XML源代码到本地
  6. SQL注入——基于报错的注入(五)
  7. php详解递归,PHP递归算法详解
  8. 深度学习算法和机器学习算法_啊哈! 4种流行的机器学习算法的片刻
  9. Vmware vSphere 十个疑难问题解决方法
  10. colorbar的应用
  11. 求解偏微分方程开源有限元软件deal.II学习--Step 3
  12. android studio: 让项目通过阿里云 maven jcenter 下载依赖资源
  13. win7首次使用计算机,首次安装win7系统如何进行硬盘分区
  14. Infor M3咨询服务调研报告-Infor M3咨询服务生产基地、总部、竞争对手及市场地位
  15. 电脑出问题解决办法(WinXP)
  16. 5不触发系统键盘_智能化子系统红外周界报警的基础知识介绍!
  17. Python爬虫福利:带你爬取妹子图上的美女图片,学习改变生活
  18. python中area是什么意思_python之懒惰属性(延迟初始化)
  19. Ajax --- 获取服务器端的响应
  20. icloud安装错误怎么办_给你细说win7系统icloud win7安装失败的修复办法

热门文章

  1. Tensor VS NumPy
  2. 获取树莓派4ip地址(手机热点获取)
  3. CentOS 7.7 x86-64安装系统字体及美化实录
  4. Ubuntu 14.04 64bit上安装有道词典Linux版本
  5. Blender车辆绑定动画制作视频教程
  6. 下载安装 binary editor
  7. 通过Shell脚本将VSS项目批量创建并且提交迁移至Gitlab
  8. 14_传智播客iOS视频教程_instancetype
  9. JavaScript关键字this指向
  10. 【转】初等数论 ——原根、指标及其应用