Linux源码分析之:malloc、free
之前写代码的时候一直有个疑问,malloc申请内存的时候指定了内存大小,但是free的时候却只指定要释放的内存地址,那么free是如何知道它要释放的内存空间大小呢?
源码之前,了无秘密,下面就从源码来扒一扒。

由上图可知,malloc和free分别调用了malloc_internal和free_internal来实现具体的操作。

在malloc_internal中,最需要注意的一行就是计算需要分配空间的大小,可以看到,计算该空间时还加了一个sizeof(allocation_header),该结构体内部有两个成员:allocation_index、allocation_size。
此处的allocation_size是解答上面疑问的关键,它记录了调用malloc时分配的空间大小,再来看free_internal。

在free中,先是调用get_header获取到了调用malloc时分配的allocation_header,然后将该header作为参数传入free_internal中,因此调用free时不必传入空间的大小,因为可以计算出来。
Linux源码分析之:malloc、free的更多相关文章
- linux源码分析2
linux源码分析 这里使用的linux版本是4.8,x86体系. 这篇是 http://home.ustc.edu.cn/~boj/courses/linux_kernel/1_boot.html ...
- linux源码分析(一)
前置:这里使用的linux版本是4.8,x86体系. 其实linux的内核启动的入口文件还是非常好找的,init/main.c. static 和 extern 首先理解的是static和extern ...
- linux源码分析(五)-start_kernel
前置:这里使用的linux版本是4.8,x86体系. local_irq_disable(); 这个函数是做了关闭中断操作.和后面的local_irq_enable相对应.说明启动的下面函数是不允许被 ...
- linux源码分析(四)-start_kernel-cgroup
前置:这里使用的linux版本是4.8,x86体系. cgroup_init_early(); 聊这个函数就需要先了解cgroup. cgroup概念 这个函数就是初始化cgroup所需要的参数的.c ...
- linux源码分析(三)-start_kernel
前置:这里使用的linux版本是4.8,x86体系. start_kernel是过了引导阶段,进入到了内核启动阶段的入口.函数在init/main.c中. set_task_stack_end_mag ...
- linux源码分析(二)-启动过程
前置:这里使用的linux版本是4.8,x86体系. 这篇是 http://home.ustc.edu.cn/~boj/courses/linux_kernel/1_boot.html 的学习笔记. ...
- linux源码分析 - 进程
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 最近在回想一些知识点的时候,觉得对进程这一块有些模糊,特别写一篇随笔对进程信息进行巩固和复习. 程序和进程 以我 ...
- 源码分析:动态分析 Linux 内核函数调用关系
源码分析:动态分析 Linux 内核函数调用关系 时间 2015-04-22 23:56:07 泰晓科技 原文 http://www.tinylab.org/source-code-analysi ...
- Linux内核源码分析方法
一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都 ...
随机推荐
- 工作log
整理电脑, 发现这么个文档, 留个纪念... 1. 2016-11-17 ================================ 3.采集任务编制页面,表格表头点击实现升序/降序排列 5.s ...
- null的数据类型
Oracle的NULL代表的含义是不确定,那么不确定的东西也会有确定的数据类型吗?或者换个说法,NULL在Oracle中的默认数据类型是什么,下面就来探讨这个问题. 首先公布答案,NULL的默认类型是 ...
- lu协程练习
生产者和消费者问题:当协程调用yield时,从一个悬而未决的resume中返回.简单的协程练习: function receive() local status,value = coroutine.r ...
- Linux 源代码在线(http://lxr.linux.no/linux/)。
LXR 是一个通用的源代码索引器和交叉引用器 它提供了一个基于 web 的可浏览任意定义以及任意标识的用法. 它支持很多种语言. LXR 曾经被作为 “Linux 交叉引用器” 但是已经被证明它可以用 ...
- 【HTML】如何判断当前浏览器是否是IE
HTML里: HTML代码中,在编写网页代码时,各种浏览器的兼容性是个必须考虑的问题,有些时候无法找到适合所有浏览器的写法,就只能写根据浏览器种类区别的代码,这时就要用到判断代码了.在HTML代码中, ...
- Mac MySQL 数据库管理(关系型数据库管理系统)
1.管理准备工作 1)管理数据库准备工作 下载相关软件 mysql-workbench-community-6.3.10-macos-x86_64.dmg Oracle 官网 MySQL 官网 MyS ...
- RecylerView 的使用方法
package com.cardvalue.sys.fragment; import android.content.Intent; import android.net.Uri; import an ...
- ekho安装及测试(中文文字转语音)
1. 官网下载源码包 地址:http://www.eguidedog.net/ekho.php 2. 安装 xz -d ekho-7.5.tar.xz tar -xvf ekho-7.5.tar ap ...
- 【转载并整理】JAVA解析或生成xml的四种方法
参考文章 1:http://blog.csdn.net/clemontine/article/details/53011362 2:http://www.jb51.net/article/98456. ...
- Android资源文件 - 使用资源存储字符串 颜色 尺寸 整型 布尔值 数组
一. Android资源文件简介 1. Android应用资源的作用 (1) Android项目中文件分类 在Android工程中, 文件主要分为下面几类 : 界面布局文件, Java src源文件, ...