动态内存管理详解:malloc/free/new/delete/brk/mmap

C++ malloc/free/new/delete详解(内存管理) 这里写目录标题malloc/free典型用法内存分配实现过程new/delete典型用法内存分配实现过程new/delete和malloc/free的区别 malloc/free 典型用法 malloc()负责动态配置内存,大小由size决定,返回值成功时为任意类型指针,失败时为NULL。 void * malloc(size_t size) free()负责释放动态申请的内存空间,调用free( )后ptr所指向的内存空间被收回,如果ptr指向未知地方或者指向的空间已被收回,则会发生不可预知的错误,如果 阅读详情


c 内存获取和释放 malloc/free, calloc/realloc

上述8个函数/操作符是c/c++语言里常用来做动态内存的申请和释放的,要理解这些接口,大概需要

下面几个维度的了解:

1. 了解OS的进程空间模型,一个进程的地址空间,一般划分为内核区、用户区,用户区又划分为栈区、堆区、数据区、代码区。

这里的‘堆区’,‘栈区’,‘数据区’,‘内核区’,其实就是一个虚拟地址区间,动态内存最终都是从OS的'堆区'上获取的。

 

2. brk、mmap 系统调用

brk系统调用,可以让进程的堆指针增长一定的大小,逻辑上消耗掉一块本进程的虚拟地址区间,malloc向OS获取的内存大小比较小时,将直接通过brk调用获取虚拟地址,结果是将本进程的brk指针推高。

mmap系统调用,可以让进程的虚拟地址区间里切分出一块指定大小的虚拟地址区间vma_struct,并返回给用户态进程,被mmap映射返回的虚拟地址,逻辑上被消耗了,直到用户进程调用munmap,才回收回来。malloc向系统获取比较大的内存时,会通过mmap直接映射一块虚拟地址区间。mmap系统调用用处非常多,比如一个进程的所有动态库文件.so的加载,都需要通过mmap系统调用映射指定大小的虚拟地址区间,然后将.so代码动态映射到这些区域,以供进程其他部分代码访问;另外,多进程通讯,也可以使用mmap,这块另开文章详解。

无论是brk还是mmap返回的都是虚拟地址,在第一次访问这块地址的时候,会触发缺页异常,然后内核为这块虚拟地址申请并映射物理页框,建立页表映射关系,后续对该区间虚拟地址的访问,通过页表获取物理地址,然后就可以在物理内存上读写了。

 

3. malloc/free 是libc库函数

malloc/free是 libc实现的库函数,主要实现了一套内存管理机制,当其管理的内存不够时,通过brk/mmap等系统调用向内核申请进程的虚拟地址区间,如果其维护的内存能满足malloc调用,则直接返回,free时会将地址块返回空闲链表。

malloc(size) 的时候,这个函数会多分配一块空间,用于保存size变量,free的时候,直接通过指针前移一定大小,就可以获取malloc时保存的size变量,从而free只需要一个指针作为参数就可以了calloc 库函数相当于 malloc + memset(0)

除了libc自带的动态内存管理库malloc, 有时候还可以使用其他的内存管理库替换,比如使用google实现的tcmalloc ,只需要编译进程时链接上 tcmalloc的静态库并包含响应头文件,就可以透明地使用tcmalloc 了,与libc 的malloc相比, tcmalloc 在内存管理上有很多改进,效率和安全性更好。

 

4. new/new[]/delete/delete[]

new/delete 是c++ 内置的运算符,相当于增强版的malloc/free. c++是兼容c的,一般来说,同样功能的库,c++会在安全性和功能性方面

比c库做更多工作。动态内存管理这块也一样。

new的实现会调用malloc,对于基本类型变量,它只是增加了一个cookie结构, 比如需要new的对象大小是 object_size, 则事实上调用 malloc 的参数是 object_size + cookie, 这个cookie 结构存放的信息包括对象大小,对象前后会包含两个用于检测内存溢出的变量,所有new申请的cookie块会链接成双向链表。由于内置了内存溢出检测,所以比malloc更安全。

对于自定义类型,new会先申请上述的大小空间,然后调用自定义类型的构造函数,对object所在空间进行构造。c++比c强大的一个方面

就是c++编译器可以自动做构造和析构,new运算符会自动计算需要的空间大小,然后根据类型自己调用构造函数,如果存在子类型对象,或者存在继承的基类型,new都会自动调用子类型的构造函数和基类型的构造函数完成构造。同样,delete 操作符根据cookie的size知道object的大小,如果是自定义类型,会调用析构函数对object所在空间进行析构,如果有子类型或继承,自动调用子类型和基类型的析构函数,然后将cookie块从双向链表摘除,最后调用 free_dbg 释放。

new[] 和delete[]是另外两个操作符,用于数组类型的动态内存获取和释放,实现过程类似new/delete 

 

5. 参考

http://blog.youkuaiyun.com/ubuntulover/article/details/7581317

http://blog.youkuaiyun.com/szlanny/article/details/4249768


C/C++动态内存管理实战:从malloc、new到vector的演进与选择 本文深入探讨C/C++动态内存管理的演进历程,从基础的malloc/free到面向对象的new/delete,再到现代C++推荐的vector容器。通过对比分析三者的性能特点、适用场景及常见陷阱,为开发者提供内存管理的最佳实践建议,帮助提升代码安全性和效率。 阅读详情

相关推荐

C++动态内存管理:从new/malloc底层原理到高频面试题深度剖析

本文深入剖析C++动态内存管理的核心机制,从new/malloc的底层原理到高频面试题解析。详细讲解new操作符的工作流程、malloc的内存分配策略,以及两者的深度对比与混用风险。同时提供内存管理实战技巧和现代C++的演进趋势,帮助开发者掌握高效、安全的内存管理方法。

weixin_30940783的博客 355

mmap详解

  共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式, 因为进程可以直接读写内存,而不需要任何 数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则 只拷贝两次数据: 一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内 存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是...

The time is passing 1341

C#做内存映射实现

使用C#语言和.net类库实现内存映射技术,实现数据临时存取;

C#程序开发,使用内存映射加速文件读取速度。

什么是零拷贝技术?首先计算机不存在什么真的零拷贝技术,这点是确认的。零拷贝值得是减少多余的拷贝的意思。

君一席 764

测试框架组成-完整版.mmap

完整的测试框架组成,几乎包含所有测试阶段的内容: 1.功能测试 2.性能测试 3.UI自动化测试 4.接口测试 5.安全测试 6.数据库测试 7.兼容性测试 8.APP/Web等...

Csharp内存映射文件包含源码

通过网上资料自己开发的只是个初稿还有一定的问题希望大家可以完善哈哈

是时候了解下 mmap 了

由上图可以看出,进程的虚拟地址空间,由多个虚拟内存区域构成。使用mmap需要注意一点,mmap映射区域大小必须是物理页大小(page_size)的整数倍,原因是:内存的最小粒度是页,而进程虚拟地址空间和内存的映射单位也是以页为单位,为了匹配内存操作,mmap从磁盘到虚拟地址空间的映射也必须是页。5、为映射分配新的虚拟地址区域后,通过待映射的文件指针,在文件描述符表中找到对应的文件描述符,通过文件描述符,链接到内核“已打开文集”中该文件结构体,每个文件结构体维护者和这个已经打开文件相关各项信息。

chuyouyinghe的专栏 3117

Windows下快速搭建Kettle开发环境:基于9.4.0.0版本的保姆级教程

本文提供Windows系统下Kettle 9.4.0.0开发环境的详细搭建指南,涵盖源码获取、Maven配置优化、高效编译及部署运行全流程。通过实战验证的步骤和常见问题解决方案,帮助数据工程师快速完成环境配置,提升ETL开发效率。

weixin_28829479的博客 334

brk()、mmap()及malloc()基本原理

文章目录linux内存分配缺页中断linux内存分配的原理malloc()背后的实现原理malloc()和free()的功能malloc()和free()的分配算法参考资料 linux内存分配 缺页中断 什么是缺页中断,简单来说是因为操作系统采用了虚拟内存技术,程序代码/数据对应的内容并不一定是完全读入到内存中,在使用到时候发生缺页中断将对应的内容读入到内存中。 当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作: 检查要访问的虚拟地址是否合法 查找/分配一个物理页 填充物理页内容(读取磁盘,或

代码笔记本 5109

【汽车故障诊断2】从标准到实战:解码DTC格式背后的诊断逻辑

本文深入解析汽车诊断故障码(DTC)的格式与逻辑,对比了OBD-II标准(如ISO 15031-6)的5字符格式与UDS协议(ISO 14229-1)下更丰富的3字节格式。文章从国际标准出发,结合实战案例,阐述了DTC如何作为汽车电子系统的“体检报告”,帮助工程师和维修技师精准定位故障,并详细解读了UDS 19服务如何读取和管理DTC状态。

berry的博客 713

Vue 10分钟入门VR全景显示 基于photo-sphere-viewer

文章目录前言一、引入photo-sphere-viewer?二、使用步骤1.引入库2.声明容器3.内容加载4.全部代码总结 前言 由于工作的需求,要实现全景图片的展示与预览,本来以为会是一个很难的内容,没想到使用现成的组件photo-sphere-viewer就可以轻松实现,上手只需要10分钟! 一、引入photo-sphere-viewer? 可以直接通过npm进行引入 npm install photo-sphere-viewer 二、使用步骤 1.引入库 photo-sphere-viewer

YIGE_MO的博客 5867

动态内存管理详解:malloc/free/new/delete/brk/mmap(介绍的很明白)

笔试遇到的问题:自己模模糊糊,说不上来。这个介绍的很清晰明了。   c++ 内存获取和释放 new/delete,new[]/delete[] c 内存获取和释放 malloc/free, calloc/realloc 上述8个函数/操作符是c/c++语言里常用来做动态内存的申请和释放的,要理解这些接口,大概需要 下面几个维度的了解: 1. 了解OS的进程空间模型,一个进程的地址空间,

G_BrightBoy的专栏 6558

KALI虚拟机挂代理教程

需要你本地挂了代理,然后通过虚拟机连接本机代理端口,不说废话了,直接说怎么做了。 1.查看选项设置中自己的小飞机的本地端口是多少:(默认是1080) 2.本机win+r打开cmd,输入ipconfig查看本地ip,我的本地ip是192.168.0.107: 2.打开kali虚拟机,编辑ProxyChains配置文件: vi /etc/proxychains.conf 3.在文件末尾的ProxyList中添加物理机本地ip和1080端口作为代理地址: 4.保存并退出即可: esc :wq 回车 5.

qq_34853514的博客 3万+

C++中malloc、free和new、delete一文吃透

主要讲malloc/free和new/delete的区别和底层实现,本文应该是讲的很详细了,只看这一篇文章就好啦!

weixin_61360713的博客 2905

Gromacs基础教程一:入门建议

本系列教程针对的群体:非计算化学专业,而是偏生物方向的、有少量分子动力学模拟需求的人群。

m0_67843839的博客 8574

C++ new/malloc 内存分配原理:从 operator new 到 mmap 的 3 层调用链路

本文深入解析C++中new和malloc的内存分配机制,从operator new到mmap的完整调用链路。通过详细分析内存分配的原理、实现细节及性能优化建议,帮助开发者理解底层内存管理,提升代码效率和安全性。特别适合准备技术面试的C++开发者。

weixin_34034670的博客 557

【漏洞复现】永恒之蓝 MS17-010 远程溢出漏洞(CVE-2017-0143)

文章目录声明前言一、漏洞原理简述二、漏洞代码深层解析三、实验步骤四、漏洞补丁总结 声明 本篇文章仅用于技术研究与技术学习,切勿用于非授权下攻击行为,切记! 前言 Windows7 存在 MS17-010 永恒之蓝(远程溢出漏洞) ,该漏洞是方程式组织在其漏洞利用框架中一个针对SMB服务进行攻击的漏洞,该漏洞导致攻击者在目标系统上可以执行任意代码 一、漏洞原理简述 MS17-010漏洞出现在Windows SMB v1中的内核态函数 srv!SrvOs2FeaListToNt 在处理FEA(File Ex

李同學AI安全 9629

【C++】一文详解malloc/free与new/delete语句的区别

C++中动态内存管理主要通过new/delete和malloc/free实现,二者存在本质区别。new/delete是C++关键字,自动调用构造/析构函数,按对象类型分配内存,具有类型安全性;而malloc/free是C库函数,仅分配/释放内存,需手动计算字节数并类型转换。new失败会抛出异常,malloc返回NULL。对于数组操作,new[]/delete[]能正确处理元素构造/析构,而malloc/free无法管理对象生命周期。new/delete支持重载,更适用于C++面向对象开发。

2402_88083295的博客 707

SAP S/4HANA Cloud 管理员业务角色创建实战:基于 SAP_BR_ADMINISTRATOR 模板的一站式指南

摘要:SAP S/4HANA Cloud新系统初始登录时常见Fiori Launchpad无磁贴的问题,这是由于缺乏合适的业务角色分配。本文介绍了通过预交付的SAP_BR_ADMINISTRATOR模板创建管理员角色的完整流程,包括业务用户、业务角色和业务目录的核心概念解析。重点说明了直接使用模板的风险,并提供了从模板创建自定义管理员角色的详细步骤(4.1-4.3),以及权限限制设置的注意事项。文中还分享了一个实际项目案例,强调正确配置管理员角色对后续权限体系建设的关键作用。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 210

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

malloc free new delete

malloc/free malloc工作机制          malloc函数的实质体现在,它有一个将可 用的内存块连接为一个长长的列表的所谓空闲链表。调用 malloc 函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分 为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返

tf_apologize的博客 700

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【C/C++】 内存管理详解

摘要:本文详细解析C/C++内存管理,涵盖程序内存布局(栈、堆、数据段、代码段)、C语言动态内存函数(malloc/calloc/realloc/free)与C++操作符(new/delete)的区别,重点对比两者在初始化、构造析构调用及异常处理上的差异。深入探讨operator new、定位new及内存管理底层原理,并针对面试高频问题(如内存泄漏、深浅拷贝、内存对齐)提供解决方案。通过实例代码和内存布局图解,帮助开发者掌握高效安全的内存管理技巧,提升编程能力与面试竞争力。

zhangzhiqi1100的博客 1119

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

动态内存分配malloc/free/new/delete的几个关键问题及解答

malloc/free底层原理浅析

weixin_49329296的博客 272
上一篇: C++ 的 new 关键字深入理解
下一篇: 《深度探索C++对象模型》读书笔记第六章:执行期语意学
FreeeLinux
博客等级 码龄11年 421粉丝 356原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值