当前位置: 首页 > 编程日记 > 正文

深入理解malloc和free

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答案]


相关文章:

根据IP和MAC查端口

进入交换机的命令提示符.输入show ip arp 查出IP地址跟MAC 地址的对照表.再输入show mac-address-table,看一下这个MAC是从哪个端口学到的转载于:https://blog.51cto.com/124130/271033

“数学不好,干啥都不行!”骨灰级程序员:其实你们都是瞎努力!

之前很多程序员读者向我们反馈&#xff1a;1&#xff09;数据结构、编程语句&#xff0c;核心原理都是数学&#xff0c;不会数学搞编程好难&#xff0c;后来发现各种东西还要概率论&#xff0c;还要推收敛&#xff01;近似还要知道泰勒展开&#xff01;2&#xff09;做算法优化…

转:秒杀系统架构分析与实战

原文出处&#xff1a; 陶邦仁 欢迎分享原创到伯乐头条 0 系列目录 秒杀系统架构 秒杀系统架构分析与实战1 秒杀业务分析 正常电子商务流程 &#xff08;1&#xff09;查询商品&#xff1b;&#xff08;2&#xff09;创建订单&#xff1b;&#xff08;3&#xff09;扣减库存&a…

Visual Studio中的《C# 语言规范》

无意中的无意发现了个好东西——《C# 语言规范》&#xff0c;您不用到处下载&#xff0c;它就在您的Visual Studio安装目录中&#xff0c;例如&#xff1a;F:\Program Files\Microsoft Visual Studio 9.0\VC#\Specifications\2052\CSharp Language Specification.doc 这是它的目…

超轻量级中文OCR,支持竖排文字识别、ncnn推理,总模型仅17M

整理 | AI科技大本营光学字符识别&#xff08;OCR&#xff09;技术已经得到了广泛应用。比如发票上用来识别关键字样&#xff0c;搜题App用来识别书本上的试题。近期&#xff0c;这个叫做chineseocr_lite的OCR项目开源了&#xff0c;这是一个超轻量级中文ocr&#xff0c;支持竖…

Redis队列的应用

Redis用双链表list实现队列的 LPUSH key value [value ...] 将一个或多个值 value 插入到列表 key 的表头 如果有多个 value 值&#xff0c;那么各个 value 值按从左到右的顺序依次插入到表头&#xff1a; 比如说&#xff0c;对空列表 mylist 执行命令 LPUSH mylist a b c &…

Python fabric实现远程操作和部署

fabrictitle是开发&#xff0c;但是同时要干开发测试还有运维的活 (o(╯□╰)o)近期接手越来越多的东西&#xff0c;发布和运维的工作相当机械&#xff0c;加上频率还蛮高&#xff0c;导致时间浪费还是优点多。修复bug什么的&#xff0c;测试&#xff0c;提交版本库(2分钟)&…

自己写的哈希表以及解决哈希冲突

哈希表就是键值key-value对&#xff0c;使用hash函数让key产生哈希值&#xff0c;当不同的key产生相同的哈希值时就是哈希冲突了&#xff0c;产生哈希冲突可以使用拉链法。 hash.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include &…

Python与MySQL数据库的交互实战

作者 | Huang supreme编辑 | 郭芮图源 | 视觉中国安装PyMySQL库如果你想要使用python操作MySQL数据库&#xff0c;就必须先要安装pymysql库&#xff0c;这个库的安装很简单&#xff0c;直接使用pip install pymysql&#xff1b;假如这种方式还是安装不上&#xff0c;就用如下链…

Hyper-V的三种网卡

External 虚拟机和物理网络、本地主机都能通信 Internal 虚拟机之间互相通信&#xff0c;并且虚拟机能和本机通信 Private 仅允许运行在这台物理机上的虚拟机之间互相通信

filter-mapping中的dispatcher使用

web.xml里<filter-mapping>中的<dispatcher>作用 2.4版本的servlet规范在部属描述符中新增加了一个<dispatcher>元素&#xff0c;这个元素有四个可能的值&#xff1a;即 REQUEST,FORWARD,INCLUDE和ERROR 可以在一个<filter-mapping>元素中加入任意数目…

脉冲神经网络在目标检测的首次尝试,性能堪比CNN | AAAI 2020

译者 | VincentLee来源 | 晓飞的算法工程笔记脉冲神经网络(Spiking neural network, SNN)将脉冲神经元作为计算单元&#xff0c;能够模仿人类大脑的信息编码和处理过程。不同于CNN使用具体的值(continuous)进行信息传递&#xff0c;SNN通过脉冲序列(discrete)中每个脉冲发射时…

TCMalloc:线程缓存的Malloc

转载自&#xff1a; http://shiningray.cn/tcmalloc-thread-caching-malloc.html作者&#xff1a;Sanjay Ghemawat, Paul Menage 原文 翻译&#xff1a;ShiningRay 动机 TCMalloc要比glibc 2.3的malloc&#xff08;可以从一个叫作ptmalloc2的独立库获得&#xff09;和其他我测试…

今年央视的春晚能给人带来惊喜吗?

已经好多年还没看完中央电视台的春节联欢晚会自己就睡着了&#xff0c;说实在的&#xff0c;现在央视春节联欢晚会的节目总是让人期待后感到相当的平淡乏味&#xff0c;有些搞笑节目庸俗的让人笑不出来&#xff0c;绝大多数的节目都显得非常的人工&#xff0c;全然不能激发出观…

将baidu地图中的baidu logo去掉

Web 最简单方法&#xff0c;将logo的css样式改为display:none即可 <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title>移除百度地图LOGO和版权信息</title><script type"text/javascript" src"htt…

Linux环境网络库

安装libevent 官网&#xff1a;http://libevent.org/ 书籍&#xff1a;http://www.wangafu.net/~nickm/libevent-book/ Libevent参考手册翻译:http://blog.csdn.net/laoyi19861011/article/category/831215 Libevent参考手册翻译增加&#xff1a;http://blog.sina.co…

万人马拉松赛事,人脸识别系统如何快速、准确完成校验?

作者 | 阿里文娱技术专家墨贤出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;大麦的人脸闸机在2019年杭州马拉松上成功的完成了刷脸入场功能的首秀&#xff0c;相比传统的马拉松入场核验方案在入场体验和入场效率上都有了很大的提升&#xff0c;下面介绍一下大麦的人…

Collection集合List、Set

Collection集合&#xff0c;用来保存一组数据的数据结构。 Collection是一个接口&#xff0c;定义了所有集合都应该包含的特征和行为 Collection派生出了两类集合 List和Set List接口&#xff1a;List集合的特征是元素是可重复且有序 Set接口&#xff1a;Set集合的特征是元素是…

如何用Jupyter Notebook制作新冠病毒疫情追踪器?

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;新冠肺炎已在全球范围内爆发。为了解全球疫情分布情况&#xff0c;有技术人员使用Jupyter Notebook绘制了两种疫情的等值线地图&#xff08;choropleth chart&#xff09;和散点图。前者显示了一个国家/地区的疫情扩散…

关于Aptana studio工具

今天&#xff0c;使用了Aptana studio这个工具&#xff0c;界面类似于Myeclipse因使用MyEclipse比较顺手&#xff0c;这个工具上手还挺容易的。而且比Dreamweaver好用多了&#xff0c;有代码提示的工具&#xff0c;再加上工具不大&#xff0c;耗内存较小。挺喜欢这个工具的。写…

再谈JSON -json定义及数据类型

再谈json 近期在项目中使用到了highcharts ,highstock做了一些统计分析。使用jQuery ajax那就不得不使用json, 可是在使用过程中也出现了非常多的疑惑&#xff0c;比方说&#xff0c;什么情况下我们须要去将字符串转换为json对象。什么情况下就不须要转换。通过hql和sql查询返回…

Linux软连接和硬链接

1.Linux链接概念 Linux链接分两种&#xff0c;一种被称为硬链接&#xff08;Hard Link&#xff09;&#xff0c;另一种被称为符号链接&#xff08;Symbolic Link&#xff09;。默认情况下&#xff0c;ln命令产生硬链接。 【硬连接】 硬连接指通过索引节点来进行连接。在Linux的…

学语言不是写程序!

这是发到我邮箱里面的一封信&#xff0c;嗯&#xff0c;类似的信有好几封&#xff0c;春节期间呢&#xff0c;我主要陪笑笑&#xff0c;呵呵&#xff0c;不办公&#xff0c;就一直压着没有回答&#xff0c;有点delay了&#xff0c;现在给这几位同学抱个歉哈&#xff0c;对不住了…

“AI”战疫在行动,一文盘点百度大脑增援疫情防控的AI操作

2020年春节&#xff0c;注定将刻进每个人的记忆。面对突如其来的新型冠状病毒感染的肺炎疫情&#xff0c;除了一线医护人员的日夜奋战&#xff0c;“人工智能”也在特殊时期走向前沿&#xff0c;接受了抗疫洗礼。 3月13日&#xff0c;今年第一期百度大脑开放日首次通过直播的形…

POJ 2778 AC自己主动机+矩阵幂 不错的题

http://poj.org/problem?id2778 有空再又一次做下&#xff0c;对状态图的理解非常重要 题解&#xff1a; http://blog.csdn.net/morgan_xww/article/details/7834801 另外做了矩阵幂的模板&#xff1a; //ac.sz是矩阵的大小 void mulmtr(long long x[MAXNODE][MAXNODE],long l…

Libevent调用

1.最基本的打印libevent版本 #include <event.h> #include <stdio.h>int main() {const char *version event_get_version();printf("%s\n",version);return 0; }# gcc getVersion.c -o getVersion -levent 参考&#xff1a;https://github.com/mike-zh…

如何更新你的机器学习模型?手把手带你设计一个可持续的预测模型!

作者 | CloudFactory译者 | 天道酬勤 责编 | 徐威龙出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;高效的机器学习模型需要高质量的数据。训练你的机器学习模型并不是过程中的单个有限阶段。即使将其部署到生产环境中&#xff0c;也可能需要稳定的新训练数据流来确保…

占失物,笔记本电脑电池

公历&#xff1a;2009年3月18日18时11分 农历&#xff1a; 农历己丑年(牛)二月廿二 节气&#xff1a; 2009年3月5日19时2分惊蛰年建&#xff1a;己丑 月建&#xff1a;丁卯 日建&#xff1a;壬戌 时建&#xff1a;己酉 断:玄武中值天地合,故能寻到,在西方,又为长生之地,故为住…

Scala Learn 1 Basic

Chap 0 前言 focus on: Scala 的语法十分简洁Scala 运行在虚拟机之上, 可以使用 java 的海量类库和工具Scala 拥抱函数式编程的同时&#xff0c;并没有废弃面向对象Scala 既有动态语言那样的灵活简洁&#xff0c;同时有保留了静态类型检查的安全与执行效率Scala 既能处理脚本化…