【C++】动态内存管理

目录

一、C/C++的内存分布

🍔内存的划分

🍟C语言动态内存管理方式

🌮C++动态内存管理方式

 二、new 和 delete 

🍔new 和 delete 操作自定义类型

🍟operator new 与 operator delete 函数

🌮面试题:new/delete 和 malloc/free的区别

 三、结语


一、C/C++的内存分布

🍔内存的划分

🌟请看下面代码中,各种类型是如何分布的?

//全局
int n1 = 0;
static int static_n1 = 0;void test_1()
{//局部static int  static_n2 = 0;int n2 = 0;int num1[10] = { 1 };char C1[] = "abcd";const char* pC2 = "abcd";int* ptr1 = (int*)malloc(sizeof(int) * 4);int* ptr2 = (int*)calloc(4, sizeof(int));int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);free(ptr1);free(ptr3);
}

🍟C语言动态内存管理方式

👉简单回顾:

🌟C语言中动态内存管理主要通过:malloc/calloc/realloc/free

void test_2()
{int* p1 = (int*)malloc(sizeof(int) * 4);free(p1);int* p2 = (int*)calloc(4, sizeof(int));int* p3 = (int*)realloc(p2, sizeof(int) * 10);free(p3);
}

🌮C++动态内存管理方式

📘 C++有了自己的内存管理方式: 通过 new delete 操作符进行动态内存管理

void test_3()
{//动态申请一个int类型的空间//int* prt4 = (int*)malloc(sizeof(int));int* ptr4 = new int;//动态申请一个int类型的空间并初始化为10//int* prt5 = (int*)calloc(10, sizeof(int));int* ptr5 = new int(10);//动态申请10个int类型的空间//int* ptr6 = (int*)malloc(sizeof(int) * 10);int* ptr6 = new int[10];delete ptr4;delete ptr5;delete[] ptr6;
}

‼️注意:

1️⃣使用 new delete 是需要匹配使用:

👉 new   -   delete

👉new[ ] -   delete[ ]

2️⃣要注意 初始化 new( )对象个数 new[ ] 的区别

 


 二、new 和 delete 

🍔new 和 delete 操作自定义类型

📘通过上面的介绍,C++和C语言对于动态内存的管理似乎只是使用方式上的不同,那为什么要提出new和delete呢?

原因是C++中常常会将一个对象封装起来,例如日期类,个人信息类...

所以C++中 new/deletemalloc/free 的最大区别就是对于这样【自定义类型】的特殊处理

C++中 new/delete 对于自定义类型,除了开辟空间还会调用构造函数和析构函数

void test_4()
{//日期类class Date{public:Date(){cout << "Date:"<< this << endl;}~Date(){cout << "~Date:"<< this << endl;}private:int _day;int _month;int _year;};Date* pD1 = (Date*)malloc(sizeof(Date));Date* pD2 = new Date;free(pD1);delete pD2;
}

‼️注意:

操作自定义类型时  new 会调用构造函数 delete会调用析构函数,而malloc/free不会

🍟operator new 与 operator delete 函数

new 和 delete 是用户进行动态内存申请和释放的操作符

operator new operator delete是系统提供的全局函数

👉new 在底层调用 operator new ,delete 在底层调用 operator delete


查看汇编可以验证:

//调用如下代码
Complex* cptr = new Complex(1,2);//通过编译器转换为:Complex* cptr;try{void* mem = ::operator new(sizeof(Complex));cptr = static_cast<Complex*>(mem);cptr->Complex::Complex(1,2);}catch(std::bad_alloc){//内存分配失败的时候将不执行构造函数,直接抛出异常}

使用new时,进行了三步操作:

1️⃣调用operator new分配内存

2️⃣编译器对指针做转型

3️⃣调用构造函数

//调用如下代码:
Complex* cptr  = new Complex(1,2);...//do somethingdelete cptr;//通过编译器转化为:cptr->~Complex();::operator delete(cptr);

使用delete时,进行了两步操作:

1️⃣调用析构函数

2️⃣调用operator delete释放内存


再看operator new 和operator delete 的实现:

operator new (std::size_t sz) _GLIBCXX_THROW (std::bad_alloc){void *p;/* malloc (0) is unpredictable; avoid it.  */if (sz == 0)//c++标准要求,即使在请求分配0字节内存时,operator new也要返回一个合法指针sz = 1;while (__builtin_expect ((p = malloc (sz)) == 0, false)){new_handler handler = std::get_new_handler ();//分配不成功,找出当前出错处理函数if (! handler)//如果用户没有定义内存分配错误处理函数,直接抛出bad_alloc异常,否则进入错误处理函数_GLIBCXX_THROW_OR_ABORT(bad_alloc());handler ();}return p;} void operator delete(void* ptr) _NOEXCEPT{if (ptr)::free(ptr);}

可以发现,operator new 实际上也是通过malloc分配空间,operate delete 最终是通过free来释放空间的
‼️new 在申请空间失败时会抛异常,malloc 会返回 NULL

🌮面试题:new/delete 和 malloc/free的区别

1️⃣malloc/free 是函数,new/delete 是操作符

2️⃣malloc申请的空间不会初始化,new申请时可以初始化

3️⃣malloc在申请时需要手动计算空间大小,new只需跟上类型即可,如果是多个则使用[ ] 

4️⃣malloc的返回值是void*,使用时需要强转new不需要

5️⃣malloc申请空间失败时,返回NULL,使用时需要判空,new不需要,因为new需要捕获异常

6️⃣对于自定义类型,malloc/free只会申请/释放空间,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成资源的清理


 三、结语

🫡你的点赞和关注是作者前进的动力!

🌞最后,作者主页有许多有趣的知识,欢迎大家关注作者,作者会持续更新有意思的代码,在有趣的玩意儿中成长!

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

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

相关文章

开发者如何使用GCC提升开发效率Opencv人脸检测

阅读此篇前请务必阅读以下两篇&#xff0c;不然你可能都不会安装环境 文章目录 简单人脸识别第三方模型集成人脸检测 简单人脸识别 使用Opencv自带的haarcascade_frontalface_alt2模型&#xff0c;始终差一个人没标出来&#xff0c;很尴尬 报错找不到模型 EveryThing搜索一遍…

梯度提升树(GBDT)与房价预测案例

文章目录 什么是梯度提升树&#xff08;GBDT&#xff09;&#xff1f;核心思想GBDT 的特点 梯度提升树的应用案例&#xff1a;房价预测场景描述步骤详解代码详情 详细代码讲解1. 导入必要的库2. 设置中文字体支持3. 可视化真实值与预测值4. 可视化预测误差分布5. 代码的运行效果…

VMware详细安装教程

1.获取安装包 官网下载地址&#xff1a; https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html 2.安装过程 双击安装包进行安装 接受许可协议 选择安装路径&#xff08;c 盘空间大的话&#xff0c;建议保持默认&#xff09; 用户体验设置&…

STM32 软件模拟I2C 操作时序图

m24c02芯片手册可以查看时序图 起始和停止信号 写一个字节&#xff1a; 主发送起始-》 CPU 芯片内部的I2C 控制器&#xff08;片上外设主设备&#xff09;-》发送起始信号-》发送设备地址-》EEPROM&#xff08;从设备&#xff09;返回回应信号-》主发字节起始地址-》从回应-》…

2024年软件测试面试题(800道)【附带答案】持续更新...

新的一年又到了立flag的时候&#xff0c;今年你的目标是拿下大厂offer&#xff1f;还是多少万年薪&#xff1f;其实这些都离不开日积月累的过程。 为此我特意整理出一份&#xff08;超详细笔记/面试题&#xff09;它几乎涵盖了所有的测试开发技术栈&#xff0c;非常珍贵&#…

jdk1.7 发送post请求

所需依赖为 引入依赖为 import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.PostMethod;特别说明 tmpString为json对象 System.out.println("tmpString " tmpString);// 处理发送https 错误问题SSLContext context …

鸿蒙音乐播放器(超详细)

基于API9的音乐播放器&#xff0c;可播放&#xff0c;暂停&#xff0c;上&#xff0c;下一首歌曲切换等功能 文章目录 1.效果展示 2.首页 3.播放页 注&#xff1a;需要使用模拟器或真机调试运行 一、效果展示 1.首页样式&#xff1a; 2.播放样式&#xff1a; 二、首页功能代码…

基于SQL数据库的酒店管理系统

一、数据库设计 1&#xff0e;需求分析 客房的预定&#xff1a;可以通过网络进行预定&#xff0c;预定修改&#xff0c;取消预订。 客房管理&#xff1a;预定管理、客房查询、设置房态、开房、换房、续住、退房等管理。 员工管理: 员工修改信息、人员调配。 账务管理&…

绿色智能:AI机器学习在环境保护中的深度应用与实践案例

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

2.vue常用指令

2.vue常用指令 目录 1. vue的基础语法结构2. 插值语法3. vue常用指令 3.1 v-html语法结构3.2 v-text3.3 v-bind 绑定动态属性3.4 v-on 添加事件 语法格式3.4.1事件绑定3.4.2 获取event对象3.4.3 动态事件缩写3.4.5 事件绑定的修饰符 3.5 v-if v-else-if v-else5.6 v-show5.7 …

《Solana 中文开发教程》学习笔记(Part 1~4)

Part 1 &#xff1a;Solana介绍 2017年11月&#xff0c;Anatoly Yakovenko发表了一篇白皮书&#xff0c;介绍了“Proof of History”这一技术 Part 2 &#xff1a;Solana介绍 Account 在Solana中&#xff0c;"Everythin is an Account" 类似Linux世界里面把所有的…

基于触觉感知的目标识别技术在智能机器人抓取中的应用综述

引言在智能机器人抓取任务中&#xff0c;目标识别是一个核心问题。机器人不仅需要识别物体&#xff0c;还需根据物体的形状、纹理、硬度等信息来规划抓取策略。传统的目标识别方法通常依赖于视觉信息&#xff0c;但在许多复杂环境中&#xff0c;单一视觉信息往往不能提供足够的…

huggingface 中模型如何查找和使用?

在 Models - Hugging Face模型中找使用方法 https://hf-mirror.com/ 一&#xff1a;如何找到统一使用方法 对于文字处理AutoTokenizer是一样的&#xff0c;模型名可能不一样。具体操作如下&#xff1a; 1. 先在模型下面找到你需要的模型点开 2. 点开最右边的Use in Transfor…

AgentLego:组装大模型智能体“乐高”

1 AgentLego 1.1 AgentLego 是什么 AgentLego 是一个提供了多种开源工具 API 的多模态工具包&#xff0c;旨在像是乐高积木一样&#xff0c;让用户可以快速简便地拓展自定义工具&#xff0c;从而组装出自己的智能体。通过 AgentLego 算法库&#xff0c;不仅可以直接使用多种工…

w071基于springboot的图书进销存管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0…

手撕单例的 5 种写法!

单例模式是一种常见的设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。当然&#xff0c;它也是面试中的常客&#xff0c;尤其是某手面试中经常要求应聘者手撕&#xff0c;所以今天咱们就来盘盘它。 单例模式的实现方式有很多&…

制作Windows11个人iso镜像的方法

一、前期准备 1.光盘刻录软件AnyBurn 2.对应Windows11版本的iso基础镜像&#xff08;一定要对应&#xff0c;不然封装的iso镜像无法使用&#xff09; Windows11最新版本24H2的iso镜像下载地址下载 Windows 11 此前版本下载地址官方网站不再提供&#xff0c;需要自行搜索下载 笔…

timesnet+timemixer时间序列预测模型

1.timesnet 原论文源码&#xff1a;https://github.com/thuml/Time-Series-Library?tabreadme-ov-file 时间序列分析被广泛应用于众多领域中&#xff0c;如天气预报中预测气象要素的未来变化、数据质控时填补缺失值、工业生产中监控设备状态、医疗诊断时分析心跳曲线等。 不…

Linux 35.6 + JetPack v5.1.4之RTP实时视频Python框架

Linux 35.6 JetPack v5.1.4之RTP实时视频Python框架 1. 源由2. 思路3. 方法论3.1 扩展思考 - 慎谋而后定3.2 扩展思考 - 拒绝拖延或犹豫3.3 扩展思考 - 哲学思考3.4 逻辑实操 - 方法论 4 准备5. 分析5.1 gst-launch-1.05.1.1 xvimagesink5.1.2 nv3dsink5.1.3 nv3dsink sync05…

异或和公式

前缀异或和公式 前缀异或和的概念与前缀和类似&#xff0c;但它使用的是异或&#xff08;XOR&#xff09;操作而不是加法。异或操作有一些独特的性质&#xff0c;使得前缀异或和在处理某些问题时非常有用。下面是前缀异或和的推导原理&#xff1a; • 异或操作的性质&#xf…