【C++】new/delete 还是 malloc/free?C++内存管理的“世纪抉择
目录一计算机的内存的存储1内存划分2类型的判断3C语言中的动态内存管理二C当中的内存管理方式1new和delete的使用2new和delete的底层实现原理3定位new表达式三总结 malloc/free和new/delete之间的区别一计算机的内存的存储1内存划分首先看下面这张图这张图片展示了C/C程序内存区域的各个部分栈的内存由高到低进行开辟而堆的内存由低到高进行开辟。内存空间在不同位下的效果2类型的判断globalvar全局变量在静态区staticGlobalvar:静态全局变量也在静态区这两个的核心区别就是全局变量可以在这个工程下的其他文件中进行使用但是静态修饰的变量只能在当前文件下进行使用。staticvar:静态的局部变量也在静态区localvar/num1/char2局部变量和数组都在栈中*char2表示首元素依旧在栈中pchar3:常量字符串指针在栈中*pchar3表示常量字符串在代码段当中ptr1表示开辟空间的指针在栈中*ptr1表示开辟的空间在堆中3C语言中的动态内存管理在学习C中的内存管理函数之前需要先复习一下C语言当中的内存管理函数。C语言当中内存管理malloc/calloc/realloc/free二C当中的内存管理方式1new和delete的使用虽然C语言当中动态开辟内存的方式在C当中依然可以进行使用但是C开创了自己内存管理的方式即通过new和delete操作符进行动态内存管理内置类型的动态内存开辟自定义类型的内存开辟总结在申请空间时new会调用构造函数 delete会调用析构函数但是malloc和free不会除此之外malloc会进行判空防止开辟失败new开辟空间失败会抛出异常。展示32位下由此可见32位下在堆上申请1.8G左右的内存而栈上一般申请8MB左右的内存2new和delete的底层实现原理要想了解new和delete的底层原理就要先知道operator new和operator delete函数首先new和delete是用户开辟空间和释放空间的操作符operator new和operator delete是系统提供的底层函数new在底层调用operator newdelete在底层调用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/CC类型函数运算符调用构造/析构❌ 不调用✅ 调用返回值类型void*需强转类型安全不需要进行强转失败处理返回NULL手动判空抛异常自动抛出内存大小手动计算自动计算数组支持无特殊支持new[]/delete[]直接通过个数开辟可重载否是分配失败可扩容可通过realloc调整无直接对应需自己实现malloc/free是标准库函数标准库函数不能够进行重载但是new/delete是操作符操作符可以进行重载。

相关新闻

31. 完美转发:将参数原样传递

31. 完美转发:将参数原样传递

文章目录引言一、问题的本质——右值变左值1.1 右值一旦有了名字,就是左值1.2 问题的根——值类别的"名字规则"二、引用折叠——完美转发的编译器基础2.1 什么是引用折叠2.2 引用折叠在模板推导中的应用2.3 哪些是转发引用(万能引用&#xff0…

2026/6/24 12:45:26阅读更多 →
【Linux】进程控制(四)—— 手搓自主shell

【Linux】进程控制(四)—— 手搓自主shell

学习Linux到目前为止,我们都知道命令是由shell执行的,但是具体如何执行的我们看不到,因此我们今天来自己写一个shell来执行我们的指令,让大家对shell的底层有一个进阶的理解,文章的最后会给出完整代码喔~ 目录 一、打…

2026/6/24 12:40:24阅读更多 →
第六章—18—数据容器的通用操作

第六章—18—数据容器的通用操作

第六章—18—数据容器的通用操作 1.遍历 五类数据容器都支持for循环遍历 列表 元组 字符串支持while循环 (序列类型) 字典 集合不支持(非序列类型) 2不能转为字典(diet),字典要求的是键值对 3从小到大&…

2026/6/24 12:40:24阅读更多 →
REL分页实现完全指南:高效处理大数据集查询

REL分页实现完全指南:高效处理大数据集查询

REL分页实现完全指南:高效处理大数据集查询 【免费下载链接】rel :gem: Modern ORM for Golang - Testable, Extendable and Crafted Into a Clean and Elegant API 项目地址: https://gitcode.com/gh_mirrors/re/rel 在现代Web应用中,处理大数据…

2026/6/24 14:15:55阅读更多 →
Serpl项目贡献指南:如何为开源终端搜索替换工具贡献力量

Serpl项目贡献指南:如何为开源终端搜索替换工具贡献力量

Serpl项目贡献指南:如何为开源终端搜索替换工具贡献力量 【免费下载链接】serpl A simple terminal UI for search and replace, ala VS Code. 项目地址: https://gitcode.com/gh_mirrors/se/serpl 想要为Serpl这个强大的终端搜索替换工具贡献力量吗&#xf…

2026/6/24 14:15:55阅读更多 →
Melting Pot在NeurIPS 2023挑战赛中的应用与优秀解决方案分析

Melting Pot在NeurIPS 2023挑战赛中的应用与优秀解决方案分析

Melting Pot在NeurIPS 2023挑战赛中的应用与优秀解决方案分析 【免费下载链接】meltingpot A suite of test scenarios for multi-agent reinforcement learning. 项目地址: https://gitcode.com/gh_mirrors/me/meltingpot Melting Pot是一个多智能体强化学习测试场景套…

2026/6/24 14:15:55阅读更多 →
threads-gnn源码深度解读:PyTorch Geometric图分类最佳实践指南

threads-gnn源码深度解读:PyTorch Geometric图分类最佳实践指南

threads-gnn源码深度解读:PyTorch Geometric图分类最佳实践指南 【免费下载链接】threads-gnn 项目地址: https://ai.gitcode.com/hf_mirrors/pymlex/threads-gnn threads-gnn 是一个基于PyTorch Geometric实现的图神经网络分类项目,专门用于Red…

2026/6/24 14:15:55阅读更多 →
Multiverso核心组件详解:Table接口与通信协议全解析

Multiverso核心组件详解:Table接口与通信协议全解析

Multiverso核心组件详解:Table接口与通信协议全解析 【免费下载链接】Multiverso Parameter server framework for distributed machine learning 项目地址: https://gitcode.com/gh_mirrors/mu/Multiverso Multiverso是一个专为分布式机器学习设计的参数服务…

2026/6/24 14:15:55阅读更多 →
OpenInference性能优化:如何降低监控开销提升AI应用效率

OpenInference性能优化:如何降低监控开销提升AI应用效率

OpenInference性能优化:如何降低监控开销提升AI应用效率 【免费下载链接】openinference OpenTelemetry Instrumentation for AI Observability 项目地址: https://gitcode.com/gh_mirrors/op/openinference OpenInference作为AI可观测性的关键工具&#xff…

2026/6/24 14:10:55阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/24 7:33:03阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/24 2:12:09阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/24 7:37:00阅读更多 →
TaskJuggler脚本编程入门:用代码实现自动化项目管理

TaskJuggler脚本编程入门:用代码实现自动化项目管理

TaskJuggler脚本编程入门:用代码实现自动化项目管理 【免费下载链接】TaskJuggler TaskJuggler - Project Management beyond Gantt chart drawing 项目地址: https://gitcode.com/gh_mirrors/ta/TaskJuggler TaskJuggler是一款强大的开源项目管理工具&#…

2026/6/24 0:02:41阅读更多 →
终极教程:使用angular-mobile-nav实现流畅的移动页面过渡效果

终极教程:使用angular-mobile-nav实现流畅的移动页面过渡效果

终极教程:使用angular-mobile-nav实现流畅的移动页面过渡效果 【免费下载链接】angular-mobile-nav An angular navigation service for mobile applications 项目地址: https://gitcode.com/gh_mirrors/an/angular-mobile-nav angular-mobile-nav是一款专为…

2026/6/24 0:02:41阅读更多 →
Wan2.1-Fun-V1.1-1.3B-InP Web UI使用教程:无需代码的AI视频创作

Wan2.1-Fun-V1.1-1.3B-InP Web UI使用教程:无需代码的AI视频创作

Wan2.1-Fun-V1.1-1.3B-InP Web UI使用教程:无需代码的AI视频创作 【免费下载链接】Wan2.1-Fun-V1.1-1.3B-InP 项目地址: https://ai.gitcode.com/hf_mirrors/PAI/Wan2.1-Fun-V1.1-1.3B-InP Wan2.1-Fun-V1.1-1.3B-InP是一款强大的AI视频创作工具,…

2026/6/24 0:02:41阅读更多 →