当前位置: 首页 > news >正文

【C++】new/delete 还是 malloc/free?C++内存管理的“世纪抉择

目录

一,计算机的内存的存储

1,内存划分

2,类型的判断

3,C语言中的动态内存管理

二,C++当中的内存管理方式

1,new和delete的使用

2,new和delete的底层实现原理

3,定位new表达式

三,总结 :malloc/free和new/delete之间的区别


一,计算机的内存的存储

1,内存划分

首先看下面这张图,这张图片展示了C/C++程序内存区域的各个部分:

栈的内存由高到低进行开辟,而堆的内存由低到高进行开辟。

内存空间在不同位下的效果:

2,类型的判断

globalvar:全局变量在静态区

staticGlobalvar:静态全局变量也在静态区

这两个的核心区别就是:全局变量可以在这个工程下的其他文件中进行使用,但是静态修饰的变量只能在当前文件下进行使用。

staticvar:静态的局部变量也在静态区

localvar/num1/char2:局部变量和数组都在栈中

*char2:表示首元素,依旧在栈中

pchar3:常量字符串指针,在栈中

*pchar3:表示常量字符串,在代码段当中

ptr1:表示开辟空间的指针,在栈中

*ptr1:表示开辟的空间,在堆中

3,C语言中的动态内存管理

在学习C++中的内存管理函数之前,需要先复习一下C语言当中的内存管理函数。

C语言当中内存管理:malloc/calloc/realloc/free

二,C++当中的内存管理方式

1,new和delete的使用

虽然C语言当中动态开辟内存的方式在C++当中依然可以进行使用,但是C++开创了自己内存管理的方式,即:通过new和delete操作符进行动态内存管理

内置类型的动态内存开辟:

自定义类型的内存开辟:

总结:在申请空间时,new会调用构造函数 ,delete会调用析构函数,但是malloc和free不会

除此之外,malloc会进行判空防止开辟失败,new开辟空间失败,会抛出异常。

展示:

32位下:

由此可见32位下在堆上申请1.8G左右的内存,而栈上一般申请8MB左右的内存

2,new和delete的底层实现原理

要想了解new和delete的底层原理,就要先知道operator new和operator delete函数

首先new和delete是用户开辟空间和释放空间的操作符,operator new和operator delete是系统提供的底层函数,new在底层调用operator new,delete在底层调用operator delete全局函数来释放空间。

operator new 的底层还是malloc,如果申请成功就返回,如果申请失败就抛出异常

operator delete的底层还是free来释放空间

自定义类型:

new的原理:

1,调用operator new函数申请空间

2,在申请的空间上使用构造函数,进行初始化

delete的原理:

1,调用析构函数,清理对象当中开辟的资源和空间。

2,调用operator delete函数释放对象中的空间。

注意:自定义类型new/free,malloc/delete不能进行混用,可能会出现内存泄漏等问题。

总结:不要错配使用,new/delete搭配,malloc/calloc/realloc/free搭配

3,定位new表达式

在某些时候我们将new的两个组成部分进行拆分使用,就要用到new表达式

new表达式:在已经分配的内存空间中调用构造函数并初始化一个对象 。

使用形式:new(对象名)对象类型(向构造函数传入的值)

展示:

class A { public: A(int a = 0) :_a(a) { cout << "A():" << this << endl; } ~A() { cout << "~A:" << this << endl; } private: int _a; }; int main() { A* p1 = new A(1); delete p1; //进行拆分--调用operator new相当于malloc A* p2 = (A*)operator new(sizeof(A)); //定位new表达式--在已经分配内存的空间中调用构造函数并初始化为2 new(p2)A(2); //可以直接通过指针调用析构函数 p2->~A(); operator delete(p2); return 0; }

定位new表达式的使用场景比较少,一般是配合内存池进行使用,了解一下即可。

三,总结 :malloc/free和new/delete之间的区别

共同点:malloc/free和new/delete的共同点就是都需要从堆申请空间,并且需要手动释放空间。

不同点

对比项malloc/freenew/delete
语言C/C++C++
类型函数运算符
调用构造/析构❌ 不调用✅ 调用
返回值类型void*(需强转)类型安全不需要进行强转
失败处理返回NULL(手动判空)抛异常(自动抛出)
内存大小手动计算自动计算
数组支持无特殊支持new[]/delete[](直接通过个数开辟)
可重载
分配失败可扩容可通过realloc调整无直接对应(需自己实现)

malloc/free是标准库函数,标准库函数不能够进行重载,但是new/delete是操作符,操作符可以进行重载。

http://www.jsqmd.com/news/1072777/

相关文章:

  • 大型电网企业数字化转型全解析:从国网顶层战略到基层落地实践深度剖析(PPT)
  • 第31章:构建自定义Code Agent——打造专属的代码助手
  • 使用 Python 调用商品条形码查询API并解析商品信息
  • FAST-LIVO2 源码精读(九):VoxelMap 体素地图——哈希索引与八叉树平面拟合
  • 西瓜/甜瓜智能病虫害防控喷雾机上位机 Qt信创完整项目
  • 计算机网络基础:实时运输协议 RTP
  • Power BI 6 月重磅更新:9 大新功能全面提升数据分析效率
  • 牛客发布2026春季校园招聘白皮书:AI招聘趋势洞察
  • window显示驱动开发-Direct3D 着色器代码
  • 电脑蓝屏反复发作?这样排查最有效
  • 学Simulink——基于双 PWM 变流器的背靠背(Back‑to‑Back / B2B)整流‑逆变系统仿真
  • 【plant simulation自学】三、发生器和吸收器统计
  • 【ComfyUI】在Windows电脑上安装 ComfyUI并通过python脚本调用API批量生成图片
  • 2026年最受好评的EC风机企业,市场口碑盘点来了
  • SpringBoot Starter 自动装配完整原理 + 实战
  • Java 后端转 AI 大模型,这套学习路线评测帮你避坑
  • 影视行业全岗位详解|一眼看懂不盲目选岗
  • 1970-2026年中国全域景点、景区矢量点位分布数据|多源融合|历史变迁
  • C# 调用 OpenAI API 实战:一位老程序员的踩坑与经验分享
  • Python 项目实战练习
  • 计算机毕业设计之网络商城系统的设计与实现
  • 鸿蒙 NDK开发:使用预构建库(四)
  • 从 RAP Managed 到 Unmanaged,ABAP Cloud 事务模型里的责任分界线
  • 【Ai运维】Redis008篇
  • Linux环境下部署Zookeeper3.9.5(最新版)集群部署
  • TVA在机电产品视觉检测的创新应用(13)
  • 怎么跟 AI 说话才能让它写出你要的代码——我和 Claude Code 的配合心法
  • HoRain云--Flutter状态管理全景指南2026
  • MAX API v1.0.2 界面重构、后台优化、安全加固
  • 浏览器跨域Cookie安全解决方案