【05】C++ 内存管理

文章目录

  • 🌈 Ⅰ C++ 内存分布
  • 🌈 Ⅱ C++ 内存管理方式
    • 1. new 和 delete 操作内置类型
    • 2. new 和 delete 操作自定义类型
  • 🌈 Ⅲ operator new 和 operator delete
  • 🌈 Ⅳ new 和 delete 的实现原理
    • 1. 内置数据类型
    • 2. 自定义数据类型
  • 🌈 Ⅴ malloc / free 和 new / delete 的区别

🌈 Ⅰ C++ 内存分布

C++ 中程序内存区域划分

内存区域说明
内核空间用户代码不能读写
向下增长 ↓,存储定义在函数内的局部变量
内存映射段文件映射、动态库、匿名映射
向上增长 ↑,用于存储动态开辟出来的空间
数据段也叫静态区,用于存包处全局数据、静态数据
代码段存储可执行代码 / 只读常量

🌈 Ⅱ C++ 内存管理方式

  • C++ 中通过 new 和 delete 操作符来替代 C语言 中 malloc 和 free 的功能

1. new 和 delete 操作内置类型

1. new 和 delete 操作内置类型格式

  • 创建和删除 单个 对象
内置类型* 对象名 = new 内置类型;delete 对象名;
  • 创建和删除 多个 对象
内置类型* 对象名 = new 内置类型(你要 new 出来的数量);delete[] 对象名;

2. new 和 delete 操作内置类型示例

  • 这里主要采用 int 类型作为演示,其他 C++ 内置的数据类型也可以这么整。

在这里插入图片描述

2. new 和 delete 操作自定义类型

  • 在申请自定义类型的空间时,new 会调用构造函数,delete 会调用析构函数

1. new 和 delete 操作自定义类型格式

  • 创建和删除 单个 对象
自定义类型名* 对象名 = new 自定义类型名(传给构造函数的参数);delete 对象名;
  • 创建和删除 多个 对象
自定义类型名* 对象名 = new 自定义类型名[创建对象的数量];delete[] 对象名;

2. new 和 delete 操作自定义类型示例

class date
{
public:date(int year = 1, int month = 1, int day = 1):_year(year),_month(month),_day(day){cout << "这是一个构造函数" << endl;}~date(){cout << "这是一个析构函数" << endl;}
private:int _year;int _month;int _day;
};int main()
{date* d1 = new date;			// new 一个日期类东西,并用缺省参数调用构造函数初始化date* d2 = new date(2024,2, 9);	// new 一个日期类对象,并用所给的值调用构造函数初始化date* d3 = new date[3];			// new 三个日期类对象,并对每个对象使用缺省参数初始化delete d1;						// 删除 new 出来的单个对象delete d2;delete[] d3;					// 删除 new 出来的多个对象return 0;
}

🌈 Ⅲ operator new 和 operator delete

概念

  • operator new 和 operator delete 是全局函数,不是对 new 和 delete 的重载。
  • new 在底层调用 operator new 函数申请空间,delete 则调用 operator delete 函数释放空间。
  • operator new 是对 malloc 的封装,operator delete 是对 free 的封装。

本质

  • operator new 实际上是通过 malloc 来申请空间,如果 malloc 申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。
  • operator delete 实际上是通过 free 来释放空间

🌈 Ⅳ new 和 delete 的实现原理

1. 内置数据类型

  • 如果申请的是内置类型的空间,new 和 malloc,delete 和 free 基本类似。
  • 不同的地方是 new / delete 申请和释放的是单个元素的空间,new [] 和 delete[] 申请和释放的是连续的空间。
  • new 在申请空间失败时会抛出异常,而 malloc 是返回 NULL。

2. 自定义数据类型

1. new 和 delete 的原理

  • new:先调用 operator new 函数申请空间,再在申请的空间上执行构造函数。
  • delete:先在空间上执行析构函数,完成对象中资源的清理工作。再调用 operator delete 函数去释放对象的空间。

在这里插入图片描述

2. new T[n] 和 delete[] 的原理

  • new T[n]:先调用 operator new[] 函数,在 operator new[] 函数中调用 operator new 函数完成对 n 个对象空间的申请。最后在申请的空间上执行 n 次构造函数。
  • delete[]:先在释放的对象空间上执行 n 次析构函数。再调用 operator delete[] 释放空间,实际是在 operator delete[] 中调用 operator delete 来释放空间。

在这里插入图片描述

🌈 Ⅴ malloc / free 和 new / delete 的区别

1. 共同点

  • 都是从堆上申请空间,并且都需要用户主动释放。

2. 不同点

  1. malloc 和 free 是函数,而 new 和 delete 是操作符。
  2. malloc 申请的空间不会被初始化,new 可以初始化申请的空间。
  3. malloc 申请空间时,还需要手动计算空间的大小并传递给 malloc 函数。new 只需要在后面跟上该对象的类型即可,如果要 new 多个对象,只需在 [] 中指定对象个数即可。
  4. malloc 的返回值为 void*,在使用时必须要进行强转。而 new 因为后面跟着该空间的类型,因此不需要对返回值进行强转。
  5. malloc 需要手动检查是否开辟空间失败。new 失败了是抛异常,不需要手动检查。
  6. 申请自定义类型对象时,malloc / free只会开辟空间。而 new 在申请空间后会调用构造函数完成对象的初始化,delete 在释放空间前会调用析构函数。

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

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

相关文章

过渡效果的艺术:CSS transition 让网页交互更平滑(下)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

使用人工智能将扫描地图中的数据数字化

Bunting Labs 推出了新版本QGIS AI 地图追踪插件&#xff0c;这是一款由人工智能驱动的自动数字化扫描地图和平面图特征的工具。Egan 和联合创始人 Brendan Ashworth 开发了这个插件&#xff0c;以快速加快从扫描地图和平面图中提取地理特征的过程。 通常&#xff0c;从 PDF 中…

飞天使-linux操作的一些技巧与知识点9-zabbix6.0 容器之纸飞机告警设置

文章目录 zabbix 告警纸飞机方式webhook 方式 zabbix 告警纸飞机方式 第一种方式参考 https://blog.csdn.net/yetugeng/article/details/99682432bash-4.4$ cat telegram.sh #!/bin/bashMSG$1TOKEN"61231432278:AAsdfsdfsdfsdHUxBwPSINc2kfOGhVik" CHAT_ID-41dsdde…

Rust方法自动解引用测试,总结和补充

// 定义一个结构体MyBox&#xff0c;包含一个原始指针 struct MyBox<T>(T);// 方法调用 . 操作&#xff0c;对方法的self 进行加& &mut * 还有 无大小转换 trait MyTrait {fn test0(mut self, x: &i32) where Self: Sized {println!("test0 :{}", …

PyTorch: torch.max()函数详解

torch.max函数详解&#xff1a;基于PyTorch的深入探索 &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;torch.max()函数简介&#x1f333;&#x1f333;torch.max()的返回值&#x1f333;&#x1f333;torch.max()的应用示例&#x1f333;&am…

EMNLP 2023精选:Text-to-SQL任务的前沿进展(下篇)——Findings论文解读

导语 本文记录了今年的自然语言处理国际顶级会议EMNLP 2023中接收的所有与Text-to-SQL相关&#xff08;通过搜索标题关键词查找得到&#xff0c;可能不全&#xff09;的论文&#xff0c;共计12篇&#xff0c;包含5篇正会论文和7篇Findings论文&#xff0c;以下是对这些论文的略…

Leetcode2786. 访问数组中的位置使分数最大

Every day a Leetcode 题目来源&#xff1a;2786. 访问数组中的位置使分数最大 解法1&#xff1a;动态规划 状态数组&#xff1a; dp[i][0]: 访问下标范围 [0, i] 中的元素且最后访问的元素是偶数时的最大得分&#xff1b;dp[i][1]: 访问下标范围 [0, i] 中的元素且最后访问…

html5+css3胶囊按钮代码

效果 代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title></title> <style> /* 胶囊开关的样式 */ .switch { position: relative; display: inline-block; width: 6…

EasyExcel操作Excel表格

一、EasyExcel介绍 1.1 介绍 EasyExcel 是一个基于 Java 的简单易用的 Excel 文件读写工具&#xff0c;它提供了一种简单而又高效的方式来读取、写入和操作 Excel 文件。EasyExcel 是阿里巴巴开源的项目&#xff0c;它旨在简化开发人员处理 Excel 文件的流程&#xff0c;使得…

Elasticsearch中的动态DSL解决方案

目录 问题背景 解决方案 编写es的mapper 动态dsl编写 使用mapper获取动态dsl 远程调用restful api查询 问题背景 在大数据量的业务系统中&#xff0c;一般都会引入Elasticsearch来作为搜索引擎&#xff0c;而搜索的条件又是多种多样的。回顾下&#xff0c;如果是mysql等…

API网关架构设计与实现的经验总结与实践

API网关是现代微服务架构中的重要组件&#xff0c;它充当了前端和后端微服务之间的中介。本文将介绍API网关的架构设计原则和实现方法&#xff0c;以帮助开发人员更好地理解和应用这些技术。 1. 什么是API网关&#xff1f; - 解释了API网关的基本概念和作用&#xff0c;以及…

【Spring框架】Spring事务的原理

目录 〇、对类或方法的Spring事务属性进行解析 0.1 解析标签 0.2 注册 InfrastructureAdvisorAutoProxyCreator 0.3 判断目标方法是否适合 canApply 0.4 匹配标签 match 0.5 小结 一、Spring事务的实现 1.1 准备事务 1.1.1 收集Transactional注解属性信息&#xff0c;…

美创科技与河南金融信创生态实验室签署战略合作协议

2024年1月31日&#xff0c;由普惠通科技与河南省科学院物理所、北京交通大学、中国金融电子化集团重庆金融认证中心联合发起成立中部地区第一家金融信创生态实验室运营公司&#xff08;即河南豫科普惠通信创科技有限公司&#xff09;与杭州美创科技股份有限公司战略合作签约仪式…

探索Xposed框架:个性定制你的Android体验

探索Xposed框架&#xff1a;个性定制你的Android体验 1. 引言 在当今移动设备市场中&#xff0c;Android系统作为最受欢迎的操作系统之一&#xff0c;其开放性和可定制性备受用户青睐。用户希望能够根据个人喜好和需求对其设备进行定制&#xff0c;以获得更符合自己习惯的使用…

深度学习自然语言处理(NLP)模型BERT:从理论到Pytorch实战

文章目录 深度学习自然语言处理&#xff08;NLP&#xff09;模型BERT&#xff1a;从理论到Pytorch实战一、引言传统NLP技术概览规则和模式匹配基于统计的方法词嵌入和分布式表示循环神经网络&#xff08;RNN&#xff09;与长短时记忆网络&#xff08;LSTM&#xff09;Transform…

谷歌 DeepMind 联合斯坦福推出了主从式遥操作双臂机器人系统增强版ALOHA 2

谷歌 DeepMind 联合斯坦福推出了 ALOHA 的增强版本 ——ALOHA 2。与一代相比&#xff0c;ALOHA 2 具有更强的性能、人体工程学设计和稳健性&#xff0c;且成本还不到 20 万元人民币。并且&#xff0c;为了加速大规模双手操作的研究&#xff0c;ALOHA 2 相关的所有硬件设计全部开…

Elasticsearch:通过 ingest pipeline 对大型文档进行分块

在我之前的文章 “Elasticsearch&#xff1a;使用 LangChain 文档拆分器进行文档分块” 中&#xff0c;我详述了如何通过 LangChain 对大的文档进行分块。那个分块的动作是通过 LangChain 在 Python 中进行实现的。对于使用版权的开发者来说&#xff0c;我们实际上是可以通过 i…

开源的JS动画框架库介绍

开源的JS动画框架库介绍 在现代网页设计中&#xff0c;动画已经成为提升用户体验的重要手段。它们不仅能够吸引用户的注意力&#xff0c;还能够帮助用户更好地理解和导航网站。JavaScript 动画框架库提供了一套丰富的动画效果&#xff0c;让开发者能够轻松地实现复杂的…

大模型实践笔记(2)——Clip改进:通过文本检索视频帧

目录 超参数设置 配置LLM-clip的backbone 文本编码 抽取视频帧并编码 视频帧匹配 保存结果帧 工程流 全是干货 超参数设置 # 超参数设置 PARAMS {"clip_model": "openai/clip-vit-base-patch32", # 推理模型名称"video_folder": "…

Gitlab和Jenkins集成 实现CI (三)

Gitlab和Jenkins集成 实现CI (一) Gitlab和Jenkins集成 实现CI (二) Gitlab和Jenkins集成 实现CI (三) 自动部署 配置免密ssh 进入http服务器 生成ssh密钥 ssh-keygen -t rsa进入jenkins(容器) 拷贝公钥 ssh-copy-id http服务器用户名http服务器ip #输入http服务器密码配…