编程之路刚刚开始,错误难免,希望大家能够指出。 

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()工作原理的更多相关文章

  1. 浅谈dedecms模板引擎工作原理及其自定义标签

    浅谈dedecms模板引擎工作原理: 理解织梦模板引擎有什么意思? 可以更好地自定义标签.更多在于了解织梦系统,理解模板引擎是理解织梦工作原理的第一步. 理解织梦会使我们写PHP代码是更顺手,同时能学 ...

  2. (转)浅谈dedecms模板引擎工作原理及自定义标签

    理解织梦模板引擎有什么意义?一方面可以更好地自定义标签.更多在于了解织梦系统,理解模板引擎是理解织梦工作原理的第一步.理解织梦会使我们写php代码时更顺手,同时能学习一些php代码的组织方式. 这似乎 ...

  3. 浅谈JSONP 的本质工作原理

    json 是一种数据格式jsonp 是一种数据调用的方式. 你可以简单的理解为 带callback的json就是jsonp 话说我们访问一个页面的时候 需要像另一个网站获取部分信息, 这就是所谓的跨域 ...

  4. 浅谈CAS(Compare and Swap) 原理

    浅谈CAS原理java并发编程也研究了一段时间了,对CAS的原理总是不太理解,今天再研究了一下,记录一些自己的理解.    说到CAS,再java中的某些情况下,甚至jdk1.5以后的大多数情况,并发 ...

  5. 从内部入手,浅谈malloc和new的区别

    想要理解一样事物,就要先用自己的语言去描述一件事物.在我查阅资料后,发现malloc函数简单说来就是空闲内存空间收集器,并把空闲空间关联起来,用术语来说就是:将空闲内存块合并起来并称为"闲置 ...

  6. Smart3D系列教程1之《浅谈无人机倾斜摄影建模的原理与方法》

    一.引言 倾斜摄影测量技术是国际测绘遥感领域近年发展起来的一项高新技术,以大范围.高精度.高清晰的方式全面感知复杂场景,通过高效的数据采集设备及专业的数据处理流程生成的数据成果直观反映地物的外观.位置 ...

  7. 浅谈malloc()与free()

    malloc()与free() l  函数原型 malloc函数的函数原型为:void* malloc(unsigned int size),它根据参数指定的尺寸来分配内存块,并且返回一个void型指 ...

  8. Git浅谈随笔之---如何工作

    其他的版本控制工具我们常见的还有SVN,关于这两者的区别,我们不多谈,详见 Git 与 SVN 的区别 : Git是一种版本控制工具.用来记录文件内容的变化,备以后查阅某个版本的情况的系统:我们在Gi ...

  9. 浅谈 linux 例行性工作 crontab (linux定时任务)

    定时任务大家都挺说过,就好比你手机上的闹钟,到了指定的时候就会响起. 今天在对redis缓存进行定时储存时又操作了一把,发现一些细节,写的不好.大家就将就看吧, 首先 简单介绍一下linux 例行性工 ...

随机推荐

  1. UVa LA 3695 - Distant Galaxy 前缀和,状态拆分,动态规划 难度: 2

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  2. HTML中元素的position属性详解

    HTML中元素的position属性详解 转载自:https://blog.csdn.net/wangzunkuan/article/details/81540935   HTML中DOM元素有5种定 ...

  3. jenkins部署java项目在本地(三)

    (1)新建maven构建的java项目 pom.xml的配置 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns ...

  4. docker samba

    这个就是匿名用户可以登录访问,不能写. root登录,就可以写了. #命令,是在物理机上运行的. 主要是根据dockerfile构建镜像. 启动容器 进入镜像 设置root密码. 附smb.conf ...

  5. 读书笔记 C# yield return与yield break执行顺序的浅析

    yield return可一次返回一个元素,并保留当前在代码中的位置,下次调用当前迭代器函数时,将从该位置从新执行.也就是说执行了yield return的时候,迭代器函数就返回了一个元素给forea ...

  6. vue-router-8-路由组件传参

    在组件中使用$route会使之与其对应路由形成高度耦合,使用props解耦 const User = { props: ['id'], template: '<div>User{{ id ...

  7. vs2013 跳过IE10

    安装 VS2013要安装IE10,却安装不了..以下为跳过IE10,直接安装VS2013方法 复制以下代码,保存为bat文件 @ECHO OFF :IE10HACK REG ADD "HKL ...

  8. fftshift函数详解

    reference: https://ww2.mathworks.cn/help/matlab/ref/fftshift.html 一.实信号情况 因为实信号以fs为采样速率的信号在 fs/2处混叠, ...

  9. Eclipse快捷键+遇到补充

    MyEclipse 快捷键1(CTRL) Ctrl+1 快速修复Ctrl+D: 删除当前行Ctrl+Q 定位到最后编辑的地方Ctrl+L 定位在某行Ctrl+O 快速显示 OutLineCtrl+T ...

  10. webpack进阶构建项目(一):1.理解webpack加载器

    1.理解webpack加载器 webpack的设计理念,所有资源都是“模块”,webpack内部实现了一套资源加载机制,这与Requirejs.Sea.js.Browserify等实现有所不同. We ...