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

C++ 智能指针简介

文章目录1.由来2.基本思想3.引用计数4.实现模板参考文献1.由来C 动态内存管理是通过一对运算符来完成的new 用于申请内存空间调用对象构造函数初始化对象并返回指向该对象的指针。delete 接收一个动态对象的指针调用对象的析构函数销毁对象释放与之关联的内存空间。动态内存的管理在实际操作中并非易事因为确保在正确的时间释放内存是极其困难的有时往往会忘记释放内存而产生内存泄露有时在上游指针引用内存的情况下释放了内存就会产生非法的野指针悬挂指针。为了更容易且更安全的管理动态内存C 推出了智能指针smart pointer类型来管理动态对象。智能指针存储指向动态对象的指针用于动态对象生存周期的控制能够确保自动正确的销毁动态分配的对象防止内存泄露。对动态内存的管理可以引申为对系统资源的管理但是 C 程序中动态内存只是最常使用的一种资源其他常见的资源还包括文件描述符file descriptor、互斥锁mutex locks、图形界面中的字型和笔刷、数据库连接、以及网络sockets等这些资源事实上都可以使用智能指针来管理。2.基本思想智能指针的基本思想是以栈对象管理资源。考察如下示例voidremodel(std::stringstr){std::string*psnewstd::string(str);...if(weird_thing()){throwexception();}str*ps;deleteps;return;}如果在函数 remodel 中出现异常语句delete ps没有被执行那么将会导致 ps 指向的 string 的堆对象残留在内存中导致内存泄露。如何避免这种问题有人会说这还不简单直接在throw exception();之前加上delete ps;不就行了。是的你本应如此问题是很多人都会忘记在适当的地方加上delete语句连上述代码中最后的那句delete语句也会有很多人忘记吧如果你要对一个庞大的工程进行review往往会发现内存泄露时有发生对于程序而言这无疑是一场灾难这时我们会想当 remodel 这样的函数终止不管是正常终止还是由于出现了异常而终止函数体内的局部变量都将自动从栈内存中删除因此指针 ps 占据的内存将被释放如果 ps 指向的内存也被自动释放那该有多好啊。我们知道析构函数有这个功能。如果 ps 有一个析构函数该析构函数将在 ps 过期时自动释放它指向的内存。但 ps 的问题在于它只是一个常规指针不是有析构凼数的类对象指针。如果 ps 是一个局部的类对象它指向堆对象则可以在 ps 生命周期结束时让它的析构函数释放它指向的堆对象。通俗来讲 智能指针就是模拟指针动作的类。所有的智能指针都会重载 - 和 * 操作符。智能指针的主要作用就是用栈智能指针离开作用域自动销毁时调用析构函数来释放资源。当然智能指针还不止这些还包括复制时可以修改源对象等。智能指针根据需求不同设计也不同写时复制赋值即释放对象拥有权限、引用计数、控制权转移等。3.引用计数什么是引用计数智能指针有时需要将其管理的对象的所有权转移给其它的智能指针使得多个智能指针管理同一个对象比如C STL中的shared_ptr支持多个智能指针管理同一个对象。这个时候智能指针就需要知道其引用的对象总共有多少个智能指针在引用在它也就是说智能指针所管理的对象总共有多少个所有者我们称之为引用计数Reference Counting因为智能指针在准备释放所引用的对象时如果有其他的智能指针同时在引用这个对象时则不能释放而只能将引用计数减一。引用计数的目的引用计数是资源管理的一种技巧和手段智能指针使用了引用计数STL中的string也同样使用了引用计数并配合“写时复制”来实现存储空间的优化。总的来说使用引用计数有如下两个目的1节省内存提高程序运行效率。如何很多对象拥有相同的数据实体存储多个数据实体会造成内存空间浪费所以最好做法是让多个对象共享同一个数据实体。2记录引用对象的所有者数量在引用计数为0时让对象的最后一个拥有者释放对象。其实智能指针的引用计数类似于Java的垃圾回收机制Java 的垃圾判定很简单如果一个对象没有引用所指那么该对象为垃圾系统就可以回收了。智能指针实现引用计数的策略。大多数 C 类用三种方法之一来管理指针成员1不管指针成员。复制时只复制指针不复制指针指向的对象实体。当其中一个指针把其指向的对象的空间释放后其它指针都成了悬挂指针。这是一种极端做法。2当复制的时候即复制指针也复制指针指向的对象。这样可能造成空间的浪费。因为指针指向的对象的复制不一定是必要的。3 第三种就是一种折中的方式。利用一个辅助类来管理指针的复制。原来的类中有一个指针指向辅助类对象辅助类的数据成员是一个计数器和一个指针指向原来的对象。可见第三种方法是优先选择的方法智能指针实现引用计数的策略主要有两种辅助类与句柄类。使用句柄类尚未研究本文以辅助类为例来研究实现智能指针的引用计数。利用辅助类来封装引用计数和指向对象的指针。如此做智能指针辅助类对象与被引用对象的关系如下图所示辅助类将引用计数与智能指针类指向的对象封装在一起引用计数记录有多少个智能指针指向同一对象。每次创建智能指针时初始化智能指针并将引用计数置为1当智能指针q赋值给另一个智能指针r时即rq拷贝构造函数拷贝智能指针并增加q指向的对象的引用计数递减r原来指向的对象的引用计数。也就是说对一个智能指针进行赋值时赋值操作符减少左操作数所指对象的引用计数如果引用计数为减至0则删除对象并增加右操作数所指对象的引用计数。4.实现模板智能指针管理对象本质上是以栈对象来管理堆对象在《Effective C》的条款13中称之为资源获取即初始化RAIIResource Acquisition Is Initialization也就是说我们在获得一笔资源后尽量以独立的一条语句将资源拿来初始化某个资源管理对象。有时候获得的资源被拿来赋值而非初始化某个资源管理对象但不论哪一种做法获得一笔资源后应该立即放进资源管理对象中。智能指针就是一种资源管理对象提供的功能主要有如下几种1以指针的行为方式访问所管理的对象需要重载指针-操作符2解引用Dereferencing获取所管理的对象需要重载解引用*操作符3智能指针在其声明周期结束时自动销毁其管理的对象4引用计数、写时复制、赋值即释放对象拥有权限、控制权限转移。第4条是可选功能拥有四条中不同的功能对应着不同类型的智能指针比如C11在STL中引入的shared_ptr就实现了引用计数的功能已经被C11摒弃的auto_ptr[ 4 ] ^{[4]}[4]实现了赋值即释放对象拥有权限C11引入的unique_ptr则实现了控制权限的转移功能。根据智能指针的功能通常用类模板实现如下templatetypenameTclassSmartPointer{private:T*_ptr;public:// 构造函数SmartPointer(T*p):_ptr(p){}// 重载*操作符Toperator*(){return*_ptr;}// 重载-操作符T*operator-(){return_ptr;}// 析构函数~SmartPointer(){delete_ptr;}};参考文献Stanley B.Lippman著,王刚杨巨峰译.C Primer第五版.2013:400-422Scott Meyers著侯捷译.Effective C中文版第三版.2011:61-77C智能指针简单剖析shared_ptr基于引用计数智能指针实现

相关文章:

C++ 智能指针简介

文章目录1.由来2.基本思想3.引用计数4.实现模板参考文献1.由来 C 动态内存管理是通过一对运算符来完成的,new 用于申请内存空间,调用对象构造函数初始化对象并返回指向该对象的指针。delete 接收一个动态对象的指针,调用对象的析构函数销毁对…...

机器学习原子势能建模:深度集成与贝叶斯神经网络的不确定性估计对比

1. 项目概述与核心问题在材料科学和计算化学领域,机器学习原子间势能模型已经从一个前沿概念,变成了加速新材料发现和深入理解物质行为的核心工具。简单来说,它就像一个“超级拟合器”,通过学习大量已知的原子构型及其对应的能量和…...

Kali NetHunter移动渗透实战:Magisk模块化部署与外设适配

1. 这不是“手机装Kali”,而是重构移动安全测试的工作流很多人第一次看到“手机跑Kali NetHunter”时,下意识反应是:这不就是把Linux桌面系统硬塞进安卓里?界面卡、命令少、工具打不开,最后变成一个炫技失败的摆设。我…...

多极球谐函数:统一机器学习势函数描述符的数学基石

1. 项目概述:从原子环境到机器学习势函数在材料科学和计算化学领域,我们这些做模拟的人,每天都在和原子打交道。一个核心的挑战是:如何让计算机“理解”一个由几十、几百甚至上万个原子构成的复杂体系,并准确预测它的能…...

JMeter临界部分控制器:业务节奏建模与资源争用压测核心

1. 为什么“临界部分控制器”是压测中真正卡住团队的隐形瓶颈?在JMeter压测项目里,我见过太多团队把90%精力花在“怎么造出1000并发”上——线程组配好、HTTP请求写完、监听器一开,看着Active Threads曲线冲上峰值就以为大功告成。结果一进生…...

混沌系统预测:输入长度如何影响模型误差与稳定性

1. 项目概述与核心问题在时间序列预测领域,尤其是在处理像气象、流体力学、金融这样高度复杂、内在混沌的系统时,我们常常面临一个核心的工程与科学问题:模型到底需要看多长的历史数据,才能做出足够好的下一时刻预测?这…...

r0capture安卓抓包原理:绕过证书固定提取SSL密钥

1. 为什么传统安卓抓包在2024年已经“失效”了? 你有没有试过:Fiddler、Charles、Wireshark全装上,证书也手动导入了,App一打开就报错“网络连接异常”,或者干脆直接闪退?我去年帮三个客户做移动安全测试时…...

UABEA:Unity跨平台资源编辑与二进制解析工具深度指南

1. 为什么Unity开发者在2024年仍要为资源编辑发愁——UABEA不是另一个UI工具,而是解耦工作流的手术刀“UABEA:终极跨平台Unity游戏资源编辑器完全指南”这个标题里,“终极”二字不是营销话术,而是对当前Unity资源编辑生态痛点的精…...

深入Linux内核链表:从of_property_read_bool看设备树属性的组织与查找

深入Linux内核链表:从of_property_read_bool看设备树属性的组织与查找 在Linux内核开发中,设备树(Device Tree)作为描述硬件配置的标准方式,其高效解析机制一直是内核开发者关注的焦点。当我们调用 of_property_read_…...

手把手教你用CentOS 7搭建Fog Project网络克隆服务器(含DHCP/TFTP配置避坑指南)

CentOS 7实战:企业级Fog Project网络克隆系统部署全攻略当企业IT部门需要同时为数十台甚至上百台计算机部署操作系统时,传统的光盘或U盘安装方式显然效率低下。这正是Fog Project大显身手的场景——一个开源的网络克隆与系统部署解决方案。本文将带您从零…...

基于图神经网络的机器学习有限区域模型:边界处理与图结构设计实战

1. 项目概述与核心挑战最近几年,机器学习天气预测(MLWP)的进展让人有点兴奋,又有点眼花缭乱。从全球尺度的大模型到区域性的精细化预报,数据驱动的方法正在重新定义我们对大气模拟的理解。作为一名长期混迹在气象和计算…...

告别高分屏适配烦恼:从开发者视角详解Win10/Win11程序属性中的DPI设置原理

告别高分屏适配烦恼:从开发者视角详解Win10/Win11程序属性中的DPI设置原理在4K/5K显示器逐渐成为主流的今天,Windows开发者面临着一个看似简单却暗藏玄机的问题:为什么同一个应用在不同分辨率的屏幕上显示效果天差地别?更令人困惑…...

Unity序列化三要素:Serializable、SerializeField与SerializeReference详解

1. 为什么Unity序列化总让人困惑——从一个真实报错说起 刚接手一个老项目时&#xff0c;我遇到个特别典型的场景&#xff1a;美术同事在Inspector里调好了角色的装备配置&#xff0c;保存后切到另一台机器打开&#xff0c;所有装备栏全空了。Debug发现&#xff0c; List<E…...

卡梅德生物技术快报|蛋白的过表达质粒构建与生信分析实验全流程复盘

从事分子生物学实验的科研从业者&#xff0c;在开展功能蛋白研究时&#xff0c;蛋白的过表达质粒构建与诱导表达是必备核心技能。实操过程中&#xff0c;很多人会忽略前期生信分析的重要性&#xff0c;盲目设计引物、构建载体&#xff0c;导致蛋白的过表达失败、蛋白无活性、纯…...

卡梅德生物技术快报|真核蛋白表达信号肽筛选实验全流程复盘

从事分子生物学实验的科研人员&#xff0c;在开展真核蛋白表达实验时&#xff0c;经常遇到目的蛋白分泌量低、胞内滞留、活性丧失等问题。信号肽作为调控蛋白分泌的核心元件&#xff0c;其选型直接决定真核蛋白表达的成败与效率。本文基于经典科研实验&#xff0c;完整复盘 8 种…...

影刀RPA跨境店群自动化:从Chromium调度到分布式容器化运营的架构演进

定了。在这场旷日持久的跨境电商反爬风控拉锯战中&#xff0c;我们终于用一套基于 Python 深度协同的分布式微服务调度架构&#xff0c;重塑了跨境千店矩阵的自动化底座。 这几天&#xff0c;科技圈被“DeepSeek V4 首发华为昇腾芯片&#xff0c;国产 AI 开始打破英伟达 CUDA …...

基于动态生物标志物变化率的生物年龄预测:LightGBM模型与纵向数据分析实践

1. 项目概述与核心价值在预防医学和健康管理领域&#xff0c;我们常常面临一个根本性的难题&#xff1a;如何准确评估一个人的“真实”衰老程度&#xff1f;我们都知道&#xff0c;身份证上的“时序年龄”只是一个粗略的刻度&#xff0c;两个同龄人&#xff0c;一个可能精力充沛…...

LLM提示压缩技术:原理、实现与优化实践

1. 提示压缩技术概述在大型语言模型&#xff08;LLM&#xff09;应用中&#xff0c;推理延迟已成为关键瓶颈。当处理包含多个检索段落的RAG&#xff08;检索增强生成&#xff09;系统时&#xff0c;长上下文会导致提示&#xff08;prompt&#xff09;体积膨胀&#xff0c;显著增…...

如何为个人网站快速接入大模型问答功能使用Taotoken

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 如何为个人网站快速接入大模型问答功能使用Taotoken 为个人网站或博客添加一个智能问答模块&#xff0c;可以显著提升访客的互动体…...

幻兽帕鲁玩不了?别急着删游戏!手把手教你用命令行参数搞定UE5黑屏闪退

幻兽帕鲁玩不了&#xff1f;别急着删游戏&#xff01;手把手教你用命令行参数搞定UE5黑屏闪退 每次打开《幻兽帕鲁》都卡在黑屏界面&#xff1f;游戏刚启动就闪退&#xff1f;这种体验确实让人抓狂。作为一款采用虚幻引擎5&#xff08;UE5&#xff09;技术打造的热门游戏&…...

ESPIM架构:稀疏计算与存内计算融合,突破边缘AI推理内存墙

1. 项目概述&#xff1a;当稀疏计算遇上存内计算在边缘设备上部署大型语言模型&#xff08;LLaMA、GPT等&#xff09;进行推理&#xff0c;正成为一个越来越普遍的需求。无论是出于隐私保护&#xff0c;还是为了应对有限的无线带宽&#xff0c;本地化推理都展现出巨大吸引力。然…...

C#模拟DirectInput鼠标玩FBA街机:协议级输入桥接方案

1. 这不是游戏外挂&#xff0c;而是让老街机在现代系统上“活过来”的底层输入桥接你有没有试过把一台尘封十年的FBA模拟器翻出来&#xff0c;想重温《街头霸王2》搓招的快感&#xff0c;结果鼠标点来点去像在操作PPT——按住左键拖动是移动光标&#xff0c;松开才是“出拳”&a…...

解决Keil MDK中RL-ARM许可证错误L9937E的方法

1. 问题现象与背景解析最近在维护一个基于Keil MDK的嵌入式老项目时&#xff0c;遇到了一个棘手的许可证错误。项目需要使用RL-ARM实时库&#xff08;Real-Time Library&#xff09;&#xff0c;但编译时出现了以下错误提示&#xff1a;Error: L9937E: RL-ARM is not allowed w…...

FastTrack:基于机器学习力场快速计算离子迁移能垒的高效方法

1. 项目概述与核心思路在材料研发&#xff0c;尤其是能源材料领域&#xff0c;我们常常需要回答一个核心问题&#xff1a;离子在这个材料里跑得快不快&#xff1f;这个“快慢”的微观物理本质&#xff0c;就是原子或离子在晶格中迁移时需要克服的能量壁垒&#xff0c;即迁移能垒…...

OpenCL图像格式兼容性与性能优化指南

1. OpenCL图像格式兼容性解析在OpenCL编程中&#xff0c;图像处理是一个核心功能模块。图像格式的正确配置直接影响着内核程序的执行效率和结果的准确性。CL_UNSIGNED_INT8和CL_RGB作为OpenCL中常见的图像格式参数&#xff0c;它们的兼容性问题值得深入探讨。1.1 图像格式描述符…...

机器学习在天文大数据中的应用:自动化分类近邻星系百万恒星

1. 项目概述&#xff1a;当机器学习遇见近邻星系的大质量恒星在浩瀚的宇宙中&#xff0c;大质量恒星&#xff08;通常指质量超过8倍太阳质量的恒星&#xff09;是名副其实的“宇宙引擎”。它们虽然数量稀少&#xff0c;但通过强烈的星风和最终的超新星爆发&#xff0c;深刻地影…...

脉冲神经网络(SNN)原理与边缘计算应用实践

1. 脉冲神经网络技术解析&#xff1a;从生物启发的计算范式到普适计算实践脉冲神经网络&#xff08;SNN&#xff09;作为第三代神经网络模型&#xff0c;其设计灵感直接来源于生物神经系统的运作机制。与传统人工神经网络&#xff08;ANN&#xff09;相比&#xff0c;SNN最显著…...

MCP插件下载403故障排查:OAuth 2026白名单机制详解

1. 问题现场还原&#xff1a;为什么MCP插件下载页面总卡在403 Forbidden&#xff1f;你点开MCP&#xff08;Model Control Platform&#xff09;官方插件市场&#xff0c;选中一个标注“支持v2.8”的调试工具&#xff0c;点击“下载ZIP”&#xff0c;浏览器控制台立刻弹出Faile…...

Unity版本选择避坑指南:LTS稳定幻觉与个人版合规雷区

1. 为什么Unity版本选择不是“装最新版就完事”&#xff1f;刚接触Unity的新手&#xff0c;十有八九会直接去官网下载那个醒目的“Download Latest Version”按钮——毕竟谁不想用上最酷的HDRP、最顺的DOTS、最全的AI工具链&#xff1f;我带过三届Unity训练营&#xff0c;每届都…...

基于机器视觉与机器学习的化学分析自动化:从颜色反应到浓度预测

1. 项目概述&#xff1a;当化学分析遇上人工智能 在实验室里&#xff0c;我们常常依赖一些经典的“颜色反应”来判断物质的浓度。比如&#xff0c;用碘化钾溶液检测水中的总氧化剂——溶液从无色逐渐变成黄色、棕色&#xff0c;颜色越深&#xff0c;氧化剂浓度越高。这个方法叫…...