[C++] 动态内存与智能指针
众所周知,C++五大内存区:全局数据区(静态区)、代码区、栈区、堆区、常量区。
全局数据区(静态区):存放全局变量,静态数据和常量;
代码区:存放所有类成员函数和非成员函数代码,函数体的二进制代码。
栈区:存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。
堆区:new、malloc、realloc分配的内存块,一般编译器不会释放内存,需要用程序释放,内存泄露通常说的就是堆区。
常量区:存放常量的,不允许修改。
其中,堆区就是动态内存的区域,就是程序员自己分配和释放内存的区域。
1.智能指针
1.1 介绍
头文件:#include<memory>
智能指针是模板。
shared_ptr:共享指针,允许多个指针指向同一个对象
unique_ptr:独占指针,只允许一个指针指向一个对象
weak_ptr:弱引用,指向shared_ptr所管理的对象。
特点:智能指针可以自动释放所指向的对象的内存。
1.2 shared_ptr类
形式:shared_ptr<T> ptrname;
特点:每个shared_ptr都有一个关联的计数器,来记录有多少个智能指针指向这个对象,
我们拷贝一个shared_ptr,计数器会递增,如:
1.当用一个shared_ptr初始化另一个shared_ptr
2.当把一个shared_ptr作为参数传递给一个函数
3.当把一个shared_ptr作为一个函数返回值时
我们销毁一个shared_ptr,或给一个shared_ptr赋值时,计数器会递减,如:
1.局部shared_ptr离开一个作用域,会被销毁,则指向这个对象的其它shared_ptr指针的计数器会递减
当计数器为0时(即没有智能指针指向这个对象了),将会调用这个对象的析构函数销毁它,并释放内存。
T:是一个类型,可以是内置类型、容器等等。
| 操作 | 含义 |
| shared_ptr<T> sp | 空智能指针,指向类型为T的对象 |
| sp | 将sp作为条件判断,如果sp指向一个对象,则为true,否则为false |
| *sp | 解引用sp,获得它指向的对象 |
| sp->mem | 等价于(*sp)->mem,调用sp指向对象的成员 |
| sp.get() | 返回sp中保存的指针。注意:若智能指针释放了其对象,返回的指针所指向的对象也就消失了。 |
| swap(sp1,sp2) sq.swap(sp2) | 交换两个智能指针 |
| make_shared<T> (args) | 返回一个shared_ptr,指向类型为T的对象。并且使用args对对象进行初始化。这是最安全的分配和使用动态内存的方法。 |
| shared_ptr<T> sp (sq) | sp是sq的拷贝,此操作会递增sq的计数器。sq中的指针必须能转换为T* |
| sp=sq | sp是sq的拷贝,此操作会递增sq的计数器,递减sp的计数器。 |
| sp.unique() | 若sp.use_count为1,则为true,否则,则为false |
| sp.use_count() | 返回与sp共享对象的智能指针数量。可能会很慢。 |
注意:
由于在最后一个shared_ptr销毁前,这个对象不会被销毁,所以就需要保证当这个shared_ptr在后面不会再使用的时候就要销毁它。如:一个容器里,存有多个shared_ptr,但是用到后面,我只需要使用其中的一部分shared_ptr,这时候我就要调用容器的erase函数,来将不用的shared_ptr给销毁掉,避免内存浪费。
1.3 unique_ptr类
| 操作 | 含义 |
| unique_ptr<T> up | 空智能指针,指向类型为T的对象 |
| up | 将up作为条件判断,如果sp指向一个对象,则为true,否则为false |
| *up | 解引用up,获得它指向的对象 |
| up->mem | 等价于(*up)->mem,调用up指向对象的成员 |
| up.get() | 返回up中保存的指针。注意:若智能指针释放了其对象,返回的指针所指向的对象也就消失了。 |
| swap(up1,up2) up.swap(up2) | 交换两个智能指针 |
2.动态内存
2.1 使用动态内存资源的类
一般在以下情况下,程序要使用动态内存资源:
1.程序不知道这个类需要分配多少对象。如:容器
2.程序不知道所需对象的准确类型。
3.程序需要在多个对象间共享数据。
3.动态内存与智能指针
相关文章:
[C++] 动态内存与智能指针
众所周知,C五大内存区:全局数据区(静态区)、代码区、栈区、堆区、常量区。 全局数据区(静态区):存放全局变量,静态数据和常量; 代码区:存放所有类成员函数和非成员函数代码,函数体的二进制代码。…...
多态的原理
有了虚函数,会在类的对象增加一个指针,该指针就是虚函数表指针_vfptr;虚表本质就是函数指针数组,虚表里面存放着该对象的虚函数的地址; 派生类继承有虚函数基类的对象模型 子类继承父类的虚表指针时,是对父类的虚表指针进行了拷…...
RK3588平台开发系列讲解(内存篇)Linux 伙伴系统数据结构
平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、 页二、区三、内存节点沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Linux 系统中,用来管理物理内存页面的伙伴系统,以及负责分配比页更小的内存对象的 SLAB 分配器了。 本篇将介绍伙伴系统相关数据结…...
Windows(MFC/C++)上进程间通讯的几种简单又实用的方法
前段时间,做了一个项目,涉及数据传输。项目实现方式有很多种,但不同的实现方式,对数据的传输方法不同,且各有优缺点。 下文就不同情况来如何选择数据传输(通讯)方式。 先说说需求,模块A获取测试数据&#…...
嘉兴桐乡会计考证培训-备考中级职称有必要报班吗?
备考中级会计职称有必要报班吗?其实,备考报班不能说是必需的,但听课学习确实是节省时间的一种方式,根据同学们的反馈,自学所花费的时间远远多于跟着老师学。上元教育就整理了一些学员报班之前走过的弯路 报班之前 在2…...
java元注解和自定义注解的区别
Java的元注解和自定义注解是两个不同的概念。 元注解是Java内置的一组用于修饰其他注解的注解,包括Retention、Target、Inherited和Documented。它们可以控制被修饰的注解的保留策略、目标范围、是否继承等属性,并且可以在编写自定义注解时使用。 Retent…...
技术到底是什么
背景 我发了朋友圈:做了个奇怪的梦,梦见被离职了,理由竟然是:你技术太菜了 我补充评论:我还没想明白怎么回事,就醒了。有点遗憾的是:想再努力反驳两句,结果没机会了… 很多人评论…...
什么CRM客户管理系统最好?
产业互联网背景下,企业数字化转型日渐深化。毋庸置疑,客户是企业的命脉,企业发展的关键便是以客户为中心,为客户创造价值,并不断实现企业的可持续性增长,而这也是每个企业永不落幕的主题。 一套优秀的CRM客…...
吴军《计算之魂》读后感
前言 断断续续,终于完成了这本书的第一次通读,记录下自己的一些想法。 先说一个小故事。前段时间家里买了一个小鱼缸,问我有没有办法让水自动循环,但不想用电。没有好的想法,去小某书上搜了下,好多案例教…...
CSS进阶
01-复合选择器 定义:由两个或多个基础选择器,通过不同的方式组合而成。 作用:更准确、更高效的选择目标元素(标签)。 后代选择器 后代选择器:选中某元素的后代元素。 选择器写法:父选择器 …...
金兰组织 | 2023金兰解决方案集经营管理篇正式发布
为助力企业创新管理、提质增效,人大金仓携手金兰组织成员单位,于近期发布多项经营管理领域的联合解决方案,共享创新应用成果。 /人大金仓高级副总裁宋瑞/ 人大金仓高级副总裁宋瑞在致辞中表示:“联合解决方案创新是指通过把不同领…...
【python】pytorch包:深度学习(序章)
今日听闻师姐说pytorch实现深度学习要比keras更好用一些,特此记录 Part 0. 机器学习 与 深度学习 的联系与区别 参考B站视频链接 联系 深度学习是机器学习的分支,人工神经网络为基础,对数据的特征进行学习的方法 区别 特征抽取 机器学…...
HTML <acronym> 标签
HTML5 中不支持 <acronym> 标签在 HTML 4 中用于定义首字母缩写词。 实例 标记一个首字母缩写: <acronym title"World Wide Web">WWW</acronym> 浏览器支持 IEFirefoxChromeSafariOpera 所有主流的浏览器均支持 <acronym> …...
python基本数据类型 - 字典集合
引入 在内存中存储的数据可以是不同的数据类型。比如名字可以使用字符串存储,年龄可以使用数字存储,python有6种基本数据类型,用于各种数据的存储,分别是:numbers(数字类型)、string(字符串)、List(列表)、Tuple(元组…...
python数据类型总结
标准数据类型 Python 有以下几种标准数据类型: 整数(int):表示整数值,如 1, -5, 0 等。浮点数(float):表示小数值,如 3.14, -0.01, 1.0 等。字符串(str&…...
TS内置类型总结
typeof 取对象身上的类型 const person {name: ,job: ,age:18 } type p typeof person ->> type p {name: string;job: string;age: number; }keyof取一个类型的属性明作为一个联合类型 const person {name: ,job: ,age: 18 } type p typeof person type k keyof p…...
Spring Cloud Alibaba: Gateway 网关过滤器 GatewayGatewayFilter factory (记录)
目录 AddRequestHeader GatewayFilter factory AddRequestHeadersIfNotPresent GatewayFilter factory AddRequestParameter GatewayFilter Factory AddResponseHeader GatewayFilter Factory CircuitBreaker GatewayFilter factory circuit breaker based on the status…...
Windows Server 2016版本说明
Windows Server 2016 Essentials edition Windows Server 2016 Essentials版是专为小型企业而设计的。它对应于Windows Server的早期版本中的Windows Small Business Server。此版本最多可容纳25个用户和50台设备。它支持两个处理器内核和高达64GB的RAM。它不支持Windows Serve…...
车载红外夜视「升温」
红外夜视赛道,正在升温。 本周,全球车载后视镜头部供应商Gentex宣布,领投以色列热成像技术初创公司ADASKY,后者在B轮融资中拿到了3000万美元。按照计划,Gentex将协助ADASKY将红外夜视技术推向汽车市场。 事实上&#x…...
ext3 文件系统的特点、优缺点以及使用场景
ext3(Third Extended File System)是 ext2 文件系统的后续版本,它在 ext2 文件系统的基础上增加了日志功能,以提高文件系统的可靠性和稳定性。下面是 ext3 文件系统的特点、优缺点以及使用场景: 特点: ext…...
Phi-4-mini-reasoning应用场景:技术文档自动逻辑校验与漏洞推理辅助工具
Phi-4-mini-reasoning应用场景:技术文档自动逻辑校验与漏洞推理辅助工具 1. 模型概述 Phi-4-mini-reasoning是一款由微软开发的3.8B参数轻量级开源模型,专为数学推理、逻辑推导和多步解题等强逻辑任务设计。该模型以"小参数、强推理、长上下文、低…...
OpenClaw技能市场盘点:Qwen3-4B模型支持的十大实用自动化模块
OpenClaw技能市场盘点:Qwen3-4B模型支持的十大实用自动化模块 1. 为什么需要关注OpenClaw技能市场? 去年冬天,当我第一次在个人笔记本上部署OpenClaw时,最让我惊喜的不是框架本身的基础能力,而是它背后那个充满可能性…...
SEO 对于SaaS产品销售有什么影响
SEO对于SaaS产品销售的重要性 在当前的数字化经济时代,软件即服务(SaaS)产品正日益成为各行各业的首选工具。仅拥有优质的产品还远远不够,如何让潜在客户能够找到并选择你的产品至关重要。这时,搜索引擎优化ÿ…...
个人简介及未来展望
前言(自我介绍):各位浏览者,大家好:我是来自辽宁工程技术大学 电气与控制工程学院 自动化专业的大一新生王阔遒,现在也就是2026年4月5日,我开始书写我的人生第一篇博客,我对编程有着…...
nRF52轻量级NFC Type 2标签驱动库解析
1. 项目概述aconno_nrf52_nfc是一个专为 Nordic Semiconductor nRF52 系列 SoC(如 nRF52832、nRF52840)设计的轻量级 NFC 标签驱动库。该库不依赖于 Nordic SDK 的完整 NFC 协议栈(如nfc_t2t_lib或nfc_ndef),而是直接操…...
白嫖DeepSeek、GLM、MiniMax、Kimi等大模型,每天 1亿 Token 免费领!
每天免费领 1亿 Token,白嫖DeepSeek、GLM、MiniMax、Kimi等大模型! 最近折腾 AI 编程的朋友估计挺多的。这玩意儿现在进化得确实有点吓人。就拿名气最大的 Claude Code 来说,它这个命令行工具直接把写代码变成了“在线聊天”。你只要嘴上说清…...
OpenClaw调试技巧:Gemma-3-12b-it任务失败的根本原因分析
OpenClaw调试技巧:Gemma-3-12b-it任务失败的根本原因分析 1. 问题背景与现象描述 上周我在本地部署了Gemma-3-12b-it模型,准备用OpenClaw实现自动化周报生成。结果连续三次任务都在"分析本周工作内容"环节卡住,控制台只显示Task …...
x86汇编堆栈
x86汇编堆栈 1)堆栈操作 x86汇编中的堆栈是一块特殊的内存区域,用于存储程序运行时的数据。它遵循"后进先出LIFO的原则",主要用于函数调用时的参数传递、局部变量存储以及保存返回地址。 堆栈操作的核心指令是PUSH和POP。PUSH指令将…...
全贴合工艺中Cover Lens Mura不良的关键影响因素与优化策略
1. 全贴合工艺中的Mura现象解析 第一次看到全贴合屏幕上出现发黄或发白的斑块时,我还以为是产品运输途中受了撞击。后来在产线蹲守三个月才发现,这些被称为"Mura"的光学缺陷,其实是贴合工艺中的隐形杀手。Mura这个词源自日语"…...
PINN 融合机器学习重构科学计算范式,物理先验赋能神经网络高效求解偏微分方程
PINN 即物理信息神经网络,将物理定律(如偏微分方程、边界条件)以约束损失形式嵌入机器学习框架,实现数据驱动与物理先验的融合。它依托神经网络的拟合能力,在训练中同时最小化观测数据误差与物理方程残差,无…...
