浅谈malloc()和free()工作原理
编程之路刚刚开始,错误难免,希望大家能够指出。
malloc()和free()是我经常需要用到的函数,一般情况下,C程序使用malloc()在堆上分配内存,free()释放内存,两者的参数和返回值就不在这叙述了,本文主要是简单的记录下malloc()和free()的工作原理。
malloc()返回内存块所采用的字节对齐方式,总是适宜于高效访问任何类型的C语言数据结构。在大多数硬件架构上,这实际意味着malloc是基于8字节或16字节边界来分配内存的。若无法分配内存,或许是因为已经抵达program break所能达到的地址上限,但一般分配内存失败的可能性很小。
一般情况下,free()并不降低program break的位置,而是将这块内存添加到空闲内存列表中,供后续的malloc()循环使用,原因有以下几点:
1.被释放的内存块通常会位于堆的中间,而非堆的顶部,因为降低program break是不可能的;
2.它最大限度地减少了程序必须执行的sbrk()调用次数,其实就是降低系统调用的开销;
3.多数情况下,降低program break的位置不会对那些分配大量内存的程序有多少帮助,因为它们通常倾向于持有已分配内存或是反复释放和重新分配内存,而非释放所有内存后再持续运行一段时间。
malloc()工作原理:
它首先会扫描之前由free()所释放的空闲内存块列表,以求找到尺寸大于或等于要求的一块空闲内存,如果这一内存块的尺寸正好与要求想当,就把该内存块地址直接返回给调用者,如果是一块较大的内存,那么将对其进行分割,在将一块大小相当的内存返回给调用者的同时,把较小的那块空闲内存保留在空闲列表中。如果空闲内存列表中没有足够大的空闲内存块,那么malloc()会调用sbrk()以分配更多的内存。为减少对sbrk()的调用次数,malloc()并未只是严格按所需字节数来分配内存,而是以更大幅度(以虚拟内存页大小的数倍)来增加program break,并将超出部分置于空闲内存列表。
malloc()分配内存块的时候,会额外分配几个字节来记录内存块的大小,该数值存放在内存块的起始处,malloc()实际返回给调用者的地址其实是该数值之后的内存块长度。
free()工作原理:
free()将内存块置于空闲链表中是根据该内存块所记录的内存块大小来实现的。
当将内存块置于空闲内存列表(双向链表)时,free()会使用内存块本身的空间来存放链表指针,将自身添加到列表中。
所以,实际上的堆是空闲内存和已分配在用内存的混合,如下图:
了解了两者的工作原理,我们在使用的时候一定要切记free()只能释放malloc()返回的指针,并且程序中有malloc(),就一定要有free()。
简单记录malloc调试工具mtrace:
代码:
#include <stdio.h>
#include <stdlib.h>
#include <mcheck.h> int main()
{
setenv("MALLOC_TRACE","output.txt",);
mtrace(); int *p = (int *)malloc( * sizeof(int)); return ;
}
执行命令:
mtrace和addr2line配合起来还是不错滴。
addr2line 可看http://www.cnblogs.com/jiangyibo/p/8653720.html
mtrace调试动态库推荐http://blog.sina.com.cn/s/blog_590be5290102vtdb.html
浅谈malloc()和free()工作原理的更多相关文章
- 浅谈dedecms模板引擎工作原理及其自定义标签
浅谈dedecms模板引擎工作原理: 理解织梦模板引擎有什么意思? 可以更好地自定义标签.更多在于了解织梦系统,理解模板引擎是理解织梦工作原理的第一步. 理解织梦会使我们写PHP代码是更顺手,同时能学 ...
- (转)浅谈dedecms模板引擎工作原理及自定义标签
理解织梦模板引擎有什么意义?一方面可以更好地自定义标签.更多在于了解织梦系统,理解模板引擎是理解织梦工作原理的第一步.理解织梦会使我们写php代码时更顺手,同时能学习一些php代码的组织方式. 这似乎 ...
- 浅谈JSONP 的本质工作原理
json 是一种数据格式jsonp 是一种数据调用的方式. 你可以简单的理解为 带callback的json就是jsonp 话说我们访问一个页面的时候 需要像另一个网站获取部分信息, 这就是所谓的跨域 ...
- 浅谈CAS(Compare and Swap) 原理
浅谈CAS原理java并发编程也研究了一段时间了,对CAS的原理总是不太理解,今天再研究了一下,记录一些自己的理解. 说到CAS,再java中的某些情况下,甚至jdk1.5以后的大多数情况,并发 ...
- 从内部入手,浅谈malloc和new的区别
想要理解一样事物,就要先用自己的语言去描述一件事物.在我查阅资料后,发现malloc函数简单说来就是空闲内存空间收集器,并把空闲空间关联起来,用术语来说就是:将空闲内存块合并起来并称为"闲置 ...
- Smart3D系列教程1之《浅谈无人机倾斜摄影建模的原理与方法》
一.引言 倾斜摄影测量技术是国际测绘遥感领域近年发展起来的一项高新技术,以大范围.高精度.高清晰的方式全面感知复杂场景,通过高效的数据采集设备及专业的数据处理流程生成的数据成果直观反映地物的外观.位置 ...
- 浅谈malloc()与free()
malloc()与free() l 函数原型 malloc函数的函数原型为:void* malloc(unsigned int size),它根据参数指定的尺寸来分配内存块,并且返回一个void型指 ...
- Git浅谈随笔之---如何工作
其他的版本控制工具我们常见的还有SVN,关于这两者的区别,我们不多谈,详见 Git 与 SVN 的区别 : Git是一种版本控制工具.用来记录文件内容的变化,备以后查阅某个版本的情况的系统:我们在Gi ...
- 浅谈 linux 例行性工作 crontab (linux定时任务)
定时任务大家都挺说过,就好比你手机上的闹钟,到了指定的时候就会响起. 今天在对redis缓存进行定时储存时又操作了一把,发现一些细节,写的不好.大家就将就看吧, 首先 简单介绍一下linux 例行性工 ...
随机推荐
- JavaMail发送邮件、带附件邮件(完整版)
工程目录如下: 1.准备javaMail需要的两个Jar包:mail.jar.activation.jar,然后add to build path 2.QQ邮箱开启SMTP服务,开启后,它会给你一串授 ...
- SignalR 开始聊天室之旅
首先明确需求,我现在有很多个直播间,每个直播间内需要存在一个聊天室,每个聊天室内可以存在很多人聊天,当然,只有登陆系统的会员才能聊天,没有登陆的,干看着吧! 根据以上需求,可以做出三个简单的页面:登陆 ...
- xshell无法在小键盘输入数字
自从很久之前用小键盘输入数字后出现奇怪的字母并换行后就不用小键盘,今天脑抽又用小键盘写数字,并决定解决问题. 原因分析: 当xshell终端类型不是"VT220"或者"A ...
- [Leetcode 3] 最长不重复子串 Longest substring without repeating 滑动窗口
[题目] Given a string, find the length of the longest substring without repeating characters. [举例] Exa ...
- VSTO:使用C#开发Excel、Word【9】
文件背后的代码VSTO支持文档背后的代码,要求开发人员使用VSTO项目中生成的具有预连接上下文和预连接事件的类.这些类有时被称为“代码后面”类,因为它们是与特定文档或工作表相关联的代码.在Word中, ...
- Linux系统下yum源配置(Centos 6)
1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的CentOS-Base ...
- Spring接管JDBC
在Spring配置JDBC <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...
- asp.net mvc 实现简单的实时消息推送
因为项目需要,需要在网页上实现消息的推送.在百度上搜索了一下,发现实现网页上的消息推送,可以使用asp.net 中的SignalR类库,当然也可以使用H5的WebSocket Ajax的轮回.当然此 ...
- L260
Innovative UK technology that can deliver drugs deep into the brain to treat neurological diseases, ...
- VS Code 使用小技巧
所有插件查找地址(https://marketplace.visualstudio.com/) 编码快捷方式(http://docs.emmet.io/cheat-sheet/) 安装插件出现 错误 ...