19 calloc 和 realloc 虚拟内存分配的调试

news2024/9/23 17:23:25

前言

 

前面提到了 malloc 虚拟内存分配相关的内容 

malloc 虚拟内存分配的调试(1)

malloc 虚拟内存分配的调试(2)

这里提 calloc 和 realloc, 这两个函数 虽然没有 malloc 使用频率那么高

但是 还是有很大的知名度的, 本文这里 我们来看一下 

calloc

此函数传入两个参数, 第一个参数是需要申请的 空间的数量, 第二个参数是 需要申请的空间的单位长度, 会申请 num 个大小为 size 的空间 

calloc 的处理就是申请 申请 num 个大小为 size 的空间, 然后将这部分空间 每一个字节 初始化为 0 

测试用例如下 

root@ubuntu:~/ClionWorkStations/HelloWorld# cat Test01Sum.c 
#include "stdio.h"

int main(int argc, char** argv) {

int x = 2;
int y = 3;
int z = x + y;

char *p1 = (char *)malloc(20);
char *p2 = (char *)malloc(20);

*p1 = '1';
*(p1+1) = '2';

free(p2);

void *p3 = calloc(2, 20);
printf("p1 : 0x%x - 0x%x \n", p1, p2);
printf("p3 : 0x%x - 0x%x \n", p3, p3);

}

先看一下 main 中的代码信息, 可以确定 我们断点是在 calloc(2, 20) 的地方 

传入的 num 为 2, elem_size 为 20 

这里计算出 总共占用的空间为 2 * 20 = 40 字节 

申请 40 字节的空间, 地址为 0x602050 

前面的 p1, p2 对应的 chunk 分别为 0x602000, 0x602020, 并且占用空间分别为 0x20 字节, top 中下一个空闲空间为 0x602040, 因此 这里用户拿到 mem/p3 是 0x602050 

接下来就是 将分配的空间 置为0 的操作了 

这里的优化很细节 

realloc 

realloc 如果更新之后的空间更小了
    如果拆分剩余的空间小于 32,则保留原样
    否则 将当前 chunk 拆分成两个 chunk
如果更新以后的空间更大
    则 如果当前是 top 最近的一块空间,尝试从 top 直接扩展,
    如果 下一个 chunk 有足够的空间,合并两个 chunk 然后再拆分需要的空间,
    否则  尝试分配空间
        如果分配空间为下一个 chunk 则合并当前 chunk
        复制原来的 chunk 的数据到 新的 chunk 的数据,然后 free 原来的 chunk

测试用例如下 

root@ubuntu:~/ClionWorkStations/HelloWorld# cat Test01Sum.c 
#include "stdio.h"

int main(int argc, char** argv) {

int x = 2;
int y = 3;
int z = x + y;

char *p1 = (char *)malloc(20);
char *p2 = (char *)malloc(20);

*p1 = '1';
*(p1+1) = '2';

free(p2);

void *p3 = realloc(p1, 10);
printf("p1 : 0x%x - 0x%x \n", p1, p2);
printf("p3 : 0x%x - 0x%x \n", p3, p3);

}


 

这是 realloc 更新之后空间 更小的情况 

1. 如果拆分之剩余的 chunk 小于 MINSIZE[32字节], 则当前 chunk 原封不动的返回 

2. 将当前 chunk 拆分成两个 chunk, 前面部分为保留的 chunk 返回, 后面部分的 chunk 更新 malloc 头, 然后 free 回收到空闲链表 

 这里的输出如下 

p1 : 0x602010 - 0x602030 
p3 : 0x602010 - 0x602010 

更新 realloc 指定空间为 30, 这是 realloc 更新之后空间 更大的情况 

这里 realloc 的是 p1, p1 对应的 chunk 为 0x602000 大小为 0x20 字节, 因此 next 为 0x602020, 对应的是 p2 

top 对应的是 0x602040

如果下一个 chunk 为 top, 并且空间足够, 则在当前 chunk 的基础上直接扩展 top, 并更新调整之后的 剩余的 chunk 的 malloc 头 

如果下一个 chunk 空闲, 并且空间足够, 则 merge 当前 chunk 和下一个 chunk, 然后尝试进行 chunk 的拆分[流程和上面 realloc 空间更小的情况一致]

否则 则尝试重新分配需要的空间 - 见下一张截图

尝试重新分配需要的空间

    如果分配到了下一个 chunk, 则和上面一样, merge 当前 chunk 和下一个 chunk, 然后尝试进行 chunk 的拆分[流程和上面 realloc 空间更小的情况一致]

    否则就是 将原有空间的数据拷贝到 重新分配的空间, 然后之后 回收掉原来的空间 

realloc(p1, 40) 就是这里的情况, 其他的情况可以自行测试 

p1 : 0x602010 - 0x602030 
p3 : 0x602050 - 0x602050 

因为空间的分配都依赖的是 malloc 的实现, 忽略掉 malloc 的实现之后 

这里的 空间分配简单得多了, 但是要理解更细节的东西, 还得理解 malloc 的分配规则 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/447098.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【系统集成项目管理工程师】项目成本管理

💥十大知识领域:项目成本管理 主要考计算题 项目进度管理包括以下 4 个过程: 制订成本管理计划成本估算成本预算成本控制 一、制订成本管理计划 制订了项目成本结构、估算、预算和控制的标准 输入工具与技术输出项目管理计划项目章程事业环境因素组织过…

拼凑出来的低代码平台,真的好用吗?(浅谈行业怪象)

0️⃣前言 这几年低代码概念非常火热,市面上的低代码平台如雨后春笋应运而生,有许多身边的朋友对我说:“未来的研发方式一定是低代码的、低技术门槛的,低代码开发是一项技术革新。 ” 然而,就在我打算对它进行深入研究…

【业务数据分析】——十大常用数据分析方法

目录 一、数据分析方法 二、营销管理方法论 1、SWOT分析 2、PEST分析 3、4P理论 三、常用数据分析方法论 1、公式拆解 2、对比分析 3、A/Btest 4、象限分析 5、帕累托分析 6、漏斗分析 7、路径分析 8、留存分析 9、5W2H分析法 10、麦肯锡逻辑树分析法 一、数据…

基于html+css的图片展示23

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

4.4 埃尔米特插值

为什么有埃尔米特插值法: 埃尔米特插值法是一种常用的数值方法,主要用于在给定的数据点集上构造一个可微的函数来近似描述这些数据点的趋势和特征。埃尔米特插值法有以下几个优点: 精度高:埃尔米特插值法可以通过给定数据点的函数…

如何在个人web项目中使用会话技术(cookiesession)?

编译软件:IntelliJ IDEA 2019.2.4 x64 操作系统:win10 x64 位 家庭版 服务器软件:apache-tomcat-8.5.27 目录 一. 什么是会话?二. 为什么要使用会话技术?三. 如何使用会话技术?3.1 Cookie(客户端的会话技术…

springboot+vue 个人健康信息管理系统

系统分为用户和医师,管理员三个角色 管理员的主要功能有: 1.管理员输入账户登陆后台 2.个人中心:管理员修改密码和账户信息 3.用户管理:对注册的用户信息进行添加,删除,修改,查询 4.医师管理&am…

seo文章批量更新-SEO文章自动批量生成

使用SEO文章生成器,让您的网站排名更靠前! 您是否对搜索引擎排名感到困扰?难道您想要网站排名更好,但却没有足够的时间和资源进行SEO优化吗?那么您需要尝试使用SEO文章生成器来帮助您的网站获得更好的排名&#xff01…

数据结构(二)—— 链表

文章目录 一、链表基础1.1 链表定义1.2 创建链表1.3 删除链表某一节点1.4 与数组的对比二、题2.1 203 移除链表元素2.2 707 设计链表2.3 206 反转单链表2.4 24 两两交换链表中的节点2.5 9 删除链表的倒数第N个节点2.6 面试题 02.07. leetcode160 链表相交2.7 142 环形链表II2.7…

Verilog带参数的`define用法

宏除了可以进行简单的文本替换,还可以像函数和任务一样传递指定多个参数分别对文本进行对应的替换. 示例1: define Disp(pa,pb,pc) \initial \begin \#1200; \$display("%d \n",(papbpc)); \$display(" data_ pa data_ pb data_ pc %d",(…

微信小程序 基于Promise 对 wx.request 封装处理

导语: 当我们进行微信小程序开发的时候,会经常涉及到发送网络请求来进行后台数据交互,而在微信小程序中,用来 发送请求的方法是 wx.request() , 但是由于 wx.request() 方法 不支持 Promise 风格的调用,所以导致 wx.re…

【C++从0到王者】第一站:从C到C++

目录 一、命名空间 1.C的命名缺陷 2.域和命名空间 3.命名空间的使用与嵌套 二、输入输出 三、缺省参数(默认参数) 1.缺省参数的概念 2.缺省参数分类 1>全缺省参数 2>半缺省参数 3.缺省参数的一些使用场景 4.缺省参数在分文件使用的注意…

系统运维(Docker篇)

前言 打怪升级之路,从未停息 ​ 在这个社会信息技术的发展速度越来越快,这种快速发展带来了激烈的竞争。在这个竞争性的环境中,只有不断学习和更新自己的技能,才能保持竞争力。其次随着云计算、容器化、自动化等技术的出现&…

Qt Quick - 容器控件综述

Qt Quick - 容器控件综述 一、概述二、ApplicationWindow Control三、Frame Control四、GroupBox Control五、Page Control六、Pane Control七、ScrollView Control八、StackView Control九、SwipeView Control十、TabBarControl十一、ToolBar控件 一、概述 Qt Quick Controls…

Linux基础——FTP原理与配置

Linux基础——FTP原理与配置 一、文件传输协议——FTP服务二、ftp配置文件解析三、FTP服务器搭建 一、文件传输协议——FTP服务 FTP是典型的C/S结构的应用层协议,需要由服务器软件、客户端软件两个部分共同实现文件传输功能 FTP 连接模式 FTP服务器默认使用TCP协议…

设计师找灵感,就上这5个网站~

分享5个设计灵感网站,多看看设计大佬的优秀作品,对提升审美、灵感都有很大的帮助,还可以结合好的设计运用到自己的作品当中,话不多说,上干货~ (PS:部分网站需要科学上网才能访问~) …

celery简单入门

celery B站连接:https://www.bilibili.com/video/BV1jg4y13718?p7&spm_id_frompageDriver&vd_source1717654b9cbbc6a773c2092070686a95 创建项目celery_project 一、新建一个celery_task.py文件 二、新建一个produce_task.py文件 三、新建一个result.py…

Linux 机器间配置 SSH 免密登录

在日常工作中,服务器常常会有多台。特别是应用服务器存在多台的情况下,在每台机器手动部署或升级服务,每次登录多台机器特别麻烦,通过一台机器跳转每次输入密码(一般都是超强密码)也麻烦。所以说配置机器间…

如何智能改写文案内容-如何用ai改字

伪原创在线文章生成器 在当今数字时代,营销推广已成为各行各业的必备工具,其中之一便是内容营销。作为内容营销的一部分,文章撰写是非常关键的环节。为了满足市场需求,越来越多的在线文章生成器涌现出来,其中最受欢迎…

最强的ChatGPT竞品来了!免费好用,不需要兔魔法,小白都能用的GPT!

ChatGPT的功能非常强大,尤其是4.0,但是门槛很高,月租需要20美金,适合专业选手!其实很多人都是小白,完全不懂GPT,也不知道怎么用,只知道这个神器非常强大,于是走了很多很多…