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

深入理解 C++ 智能指针:原理、实现与最佳实践

智能指针概述智能指针本质上是封装了裸指针的类通过 RAII资源获取即初始化管理资源生命周期。常见智能指针std::unique_ptr独占所有权不能复制只能移动。std::shared_ptr共享所有权引用计数管理。std::weak_ptr弱引用不增加引用计数用于解决循环引用。三、std::unique_ptr3.1 基本用法代码语言javascriptAI代码解释cpp复制编辑std::unique_ptrint p1(new int(10)); // p1 拥有指针3.2 独占所有权代码语言javascriptAI代码解释cpp复制编辑std::unique_ptrint p2 std::move(p1); // p1 失效p2 拥有所有权3.3 自动释放机制智能指针析构时调用delete释放内存避免泄漏。3.4 自定义删除器代码语言javascriptAI代码解释cpp复制编辑std::unique_ptrFILE, decltype(fclose) fp(fopen(file.txt, r), fclose);支持管理非new分配资源。四、std::shared_ptr4.1 引用计数机制shared_ptr内部维护两个计数强引用计数当前持有所有权的shared_ptr数量弱引用计数weak_ptr数量计数为零时释放资源。4.2 典型用法代码语言javascriptAI代码解释cpp复制编辑std::shared_ptrint sp1 std::make_sharedint(20); std::shared_ptrint sp2 sp1; // 引用计数 14.3 控制块Control Block实际实现中资源指针和引用计数放在控制块里实现高效管理。4.4 循环引用问题若两个对象互相持有shared_ptr会导致内存泄漏。五、std::weak_ptr5.1 弱引用weak_ptr不拥有对象所有权不影响引用计数。5.2 解决循环引用代码语言javascriptAI代码解释cpp复制编辑struct B; struct A { std::shared_ptrB b_ptr; }; struct B { std::weak_ptrA a_ptr; // 弱引用避免循环 };5.3 lock() 获取shared_ptr通过lock()检查资源是否还存活。六、智能指针的内部实现原理6.1 Control Block 结构持有资源指针强引用计数弱引用计数删除器指针自定义删除器6.2 引用计数操作线程安全的计数增加和减少通常使用原子操作。七、最佳实践7.1 优先使用make_shared和make_uniquemake_shared在一块内存中分配对象和控制块提高性能。避免裸new。7.2 使用unique_ptr表达独占语义避免无谓的引用计数开销。7.3 注意循环引用用weak_ptr打破循环。7.4 自定义删除器管理非内存资源管理文件、socket 等资源。八、性能考量shared_ptr的引用计数增加和减少有一定开销。unique_ptr开销最小。不恰当的过度共享会导致性能下降。

相关文章:

深入理解 C++ 智能指针:原理、实现与最佳实践

智能指针概述智能指针本质上是封装了裸指针的类,通过 RAII(资源获取即初始化)管理资源生命周期。常见智能指针:std::unique_ptr:独占所有权,不能复制,只能移动。std::shared_ptr:共享…...

LT8302无光耦隔离反激转换器设计与优化

1. LT8302无光耦隔离反激转换器设计解析在隔离电源设计领域,传统方案通常依赖光耦器件实现反馈回路的电气隔离。这种设计虽然成熟,但存在明显的局限性——光耦的电流传输比(CTR)会随温度变化和老化而漂移,导致系统稳定…...

【Linux系统编程】Ext2文件系统

上图中的外设,每个设备都可以有自己的read、write,但一定是对应着不同的操作方法!!但通过struct file 下 file_operation 中的各种函数回调,让我们开发者只用file便可调取 Linux 系统中绝⼤部分的资源!&…...

零代码驱动ST7789 TFT屏幕:WipperSnapper物联网显示方案实践

1. 项目概述:当物联网遇上“零代码”显示如果你玩过ESP32、树莓派Pico这类开发板,想把传感器数据实时显示在一块小屏幕上,大概率会经历这样的过程:打开Arduino IDE或MicroPython环境,翻找ST7789的驱动库,对…...

树莓派SPI驱动TFT显示屏:从硬件连接到Python图形编程实战

1. 项目概述与核心价值如果你手头有一块闲置的树莓派,想给它配个小屏幕做个状态监控器、迷你信息站,或者DIY一个便携游戏机,那么连接一块TFT显示屏几乎是必经之路。但当你真正动手时,可能会被一堆引脚、SPI、驱动芯片这些术语搞得…...

CircuitPython低分辨率LED矩阵高质量文本显示:DisplayIO缩放与IS31FL3741驱动实践

1. 项目概述与核心价值如果你玩过像Adafruit EyeLights这样的LED矩阵眼镜,可能会觉得在这么小的屏幕上(18列x5行)显示清晰、流畅的文字简直是天方夜谭。像素点大得跟马赛克似的,直接画上去的文字锯齿感严重,可读性很差…...

使用PCA9546 I2C多路复用器解决传感器地址冲突

1. 项目概述与问题根源在嵌入式开发和物联网项目中,I2C总线因其简洁的两线制(SDA数据线和SCL时钟线)和软件寻址机制,成为了连接各类传感器、执行器和存储芯片的首选。然而,这个看似完美的协议有一个众所周知的“阿喀琉…...

APDS9999三合一传感器实战:从硬件解析到代码应用

1. 项目概述:为什么选择APDS9999这款三合一传感器?在嵌入式项目里,传感器选型常常是个让人头疼的问题。你想做个能根据环境光自动调节亮度的智能灯,需要一个光照传感器;想做个检测物体靠近的感应装置,需要一…...

树莓派CharliePlex LED矩阵驱动:从I2C通信到Python动画实战

1. 项目概述与硬件解析如果你手头有一块树莓派,想给它加个能显示点动态信息、甚至能播放小动画的“眼睛”,那Adafruit的CharliePlex LED矩阵Bonnet绝对是个好玩又实用的选择。这东西本质上是一个直接插在树莓派GPIO排针上的扩展板(Bonnet&…...

Python办公自动化利器OfficeClaw:统一接口与实战应用

1. 项目概述:一个被低估的办公自动化利器 如果你经常需要处理Word、Excel、PDF这类办公文档,并且厌倦了重复性的点击、复制、粘贴和格式调整,那么你很可能已经听说过或尝试过一些自动化工具。今天要聊的这个项目, danielithomas/…...

边缘计算中ViT模型的优化技术与医疗应用

1. 边缘计算中的ViT优化挑战与机遇Vision Transformer(ViT)模型在计算机视觉任务中展现出卓越性能,但其庞大的计算量和内存需求给边缘设备部署带来了严峻挑战。边缘计算环境通常面临三大核心约束:有限的计算资源(如移动…...

ESP32-S2深度睡眠唤醒与音频输出:CircuitPython开发实战避坑指南

1. 项目概述 如果你正在用CircuitPython捣鼓ESP32-S2这类板子,想做个低功耗传感器节点或者带点声音提示的小玩意儿,那你大概率会踩到我接下来要聊的这些坑。从想让板子“睡醒”的奇怪限制,到死活不出声的音频输出,再到某天早上起…...

如何用智能机票监控系统自动追踪最低价格:告别手动比价的终极指南 [特殊字符]

如何用智能机票监控系统自动追踪最低价格:告别手动比价的终极指南 🛫 【免费下载链接】flight-spy Looking for the cheapest flights and dont have enough time to track all the prices? 项目地址: https://gitcode.com/gh_mirrors/fl/flight-spy …...

CircuitPython嵌入式开发实战:内存管理与无线连接优化指南

1. 项目概述与核心价值如果你和我一样,从传统的Arduino C/C开发转向更友好的微控制器编程,那么CircuitPython绝对是一个让人眼前一亮的发现。它把Python的简洁和强大带到了像Adafruit Feather、Raspberry Pi Pico这样的嵌入式硬件上,让快速原…...

BMP388/BMP390高精度气压传感器:从原理到Arduino/Python实战应用

1. 项目概述:高精度气压传感器的核心价值在嵌入式开发和物联网项目中,获取精确的环境数据往往是第一步。无论是无人机需要稳定的定高飞行,还是气象站要记录大气压力的细微变化,亦或是智能手表想要追踪你的楼层变化,都离…...

MCP服务器开源集市:AI智能体开发者的插件生态与实战指南

1. 项目概述:MCP服务器的开源集市最近在折腾AI智能体开发,特别是想让它们能更“主动”地去获取和处理外部信息,而不是仅仅依赖训练好的模型参数。在这个过程中,一个绕不开的概念就是模型上下文协议。简单来说,它就像给…...

网盘下载提速新方案:8大平台直链获取工具全解析

网盘下载提速新方案:8大平台直链获取工具全解析 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 /…...

【独家拆解】Sora 2正式版底层架构升级:从DiT-XL到时空联合注意力v3.2,性能提升217%的关键证据

更多请点击: https://intelliparadigm.com 第一章:Sora 2正式版发布背景与核心定位 OpenAI 于2024年第三季度正式发布 Sora 2,标志着视频生成模型从实验性原型迈入工业级部署新阶段。此次发布并非简单迭代,而是基于对数百万小时真…...

基于PyPortal与光传感器的物联网闭环控制:从单向指令到可靠状态反馈

1. 项目概述与核心价值如果你曾经尝试过用手机远程开关家里的台灯或者风扇,大概率会接触到“物联网”这个概念。简单来说,物联网就是让物理世界的“物”(比如电器、传感器)能够接入互联网,变得可以被远程感知和控制。听…...

免费解锁QQ音乐加密文件:qmcdump完整使用指南

免费解锁QQ音乐加密文件:qmcdump完整使用指南 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是否曾经下载…...

AI代理环境交互SDK:TypeScript实现标准化观察与动作接口

1. 项目概述:一个为AI代理构建交互式环境的TypeScript SDK如果你正在尝试构建一个能够与现实世界应用(比如浏览器、IDE、甚至操作系统)进行交互的AI代理,那么你很可能已经遇到了一个核心难题:如何让代理“看见”并“操…...

Python爬虫利器PyQuery:用jQuery语法高效解析HTML与数据提取

1. PyQuery:让Python爬虫和数据处理拥有jQuery的丝滑体验如果你和我一样,既写Python脚本处理数据,又偶尔需要和前端HTML打交道,那你一定经历过这样的纠结:面对一堆杂乱无章的HTML标签,用正则表达式吧&#…...

仅限首批200名技术负责人开放|ElevenLabs中文定制音色微调手册(含v2.4.1未公开API参数表)

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs中文语音生成优化的底层逻辑与适用边界 语音建模的语言适配瓶颈 ElevenLabs 原生模型基于英文语料大规模预训练,其中音素单元(phoneme)与韵律建模均以拉丁…...

《B4003 [GESP202406 三级] 移位》

题目背景 对应的选择、判断题:https://ti.luogu.com.cn/problemset/1151 题目描述 小杨学习了加密技术移位,所有大写字母都向后按照⼀个固定数目进行偏移。偏移过程会将字母表视作首尾相接的环,例如,当偏移量是 3 的时候&#…...

Unity游戏实时翻译神器:XUnity.AutoTranslator完全指南 [特殊字符][特殊字符]

Unity游戏实时翻译神器:XUnity.AutoTranslator完全指南 🎮🌍 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 想要畅玩外语游戏却苦于语言障碍?XUnity.AutoT…...

基于FlowAI框架的AI应用开发:从LLM工具调用到生产级工作流编排

1. 项目概述与核心价值最近在折腾AI应用开发,特别是想把大语言模型(LLM)的能力真正“用起来”,嵌入到具体的业务流程里。相信很多开发者都遇到过类似的困境:模型本身能力很强,但怎么让它稳定、可靠、低成本…...

运算放大器在扫地机器人硬件设计中的六大关键应用解析

1. 项目概述:当扫地机器人遇上运算放大器扫地机器人,这个二十多年前还只是科幻电影里的概念,如今已经成了许多家庭的清洁主力。从最初的“随机碰撞式”清扫,到如今具备激光导航、自动集尘、智能拖地等复杂功能,它的“智…...

ElevenLabs古吉拉特文语音合成失效排查手册(97.3%开发者忽略的ISO 639-2语言码陷阱)

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs古吉拉特文语音合成失效的根本诱因 ElevenLabs 官方 API 文档明确标注支持 Gujarati(gu-IN)语言标识,但实际调用时持续返回 400 Bad Request 或静音音频&…...

单片机开发者如何通过Taotoken快速接入大模型API提升代码效率

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 单片机开发者如何通过Taotoken快速接入大模型API提升代码效率 对于单片机开发者而言,嵌入式开发工作往往伴随着大量重复…...

悬而未决:Nacos 与 Apollo 能否终结“改配置就要重启”的诅咒?

写在前面“你把 log-level 从 INFO 改成 DEBUG 了?行,我记一下。等下次发布的时候一起上线。”这句话,是不是很熟悉?在一个超过 5 年的大型微服务项目中,我见过太多这样的场景:开发团队在线上环境排查问题时…...