初识std::make_shared与shared_ptr
1make_sharedmake_shared的基本用法一起完成申请内存初始化对象绑定shared_ptr举例子就像你想和同学共享一本书分两步做方式一newshared_ptr先去书店买一本书new申请内存再单独买一个 “借书登记本”shared_ptr内部的引用计数最后把书和登记本绑定在一起。问题如果买完书、还没买登记本时你突然有事走了比如程序中间出异常—— 书就丢了内存泄漏方式二std::make_shared就像你去书店一次性把 “书 借书登记本” 买好老板直接帮你绑定在一起一步到位申请书的内存 申请登记本的内存 绑定绝对安全不会出现 “书买了但登记本没买” 的情况。1. 基本用法创建简单类型比如int、string语法std::make_shared类型(初始值)#include iostream #include memory // 必须包含这个头文件 int main() { // 推荐写法用 make_shared 创建 shared_ptr指向存了 10 的 int std::shared_ptrint p1 std::make_sharedint(10); // 等价于但不推荐先 new 再绑定 shared_ptr // std::shared_ptrint p1(new int(10)); // 像普通指针一样用 std::cout *p1 std::endl; // 输出 10 return 0; }2. 创建类对象结合 ROS2 场景语法std::make_shared类名(构造函数参数)#include iostream #include memory #include string // 定义一个简单的 Person 类 class Person { public: std::string name; // 构造函数需要传入名字 Person(std::string n) : name(n) {} void say_hello() { std::cout Hello, Im name std::endl; } }; int main() { // 用 make_shared 创建 Person 对象传入构造函数参数 张三 std::shared_ptrPerson p std::make_sharedPerson(张三); // 用 - 访问类成员 p-say_hello(); // 输出 Hello, Im 张三 return 0; }2shared_ptr一、先搞懂为什么需要shared_ptr在讲shared_ptr之前先看普通指针的两个坑坑 1忘记delete导致内存泄漏// 普通指针写法 void test() { int* p new int(10); // 从堆区申请内存存了个10 // ... 业务逻辑 // 忘记写 delete p; —— 内存泄漏这块内存永远不会被释放 }就像你从图书馆借了一本书看完忘了还 —— 书内存就一直被你占着别人用不了时间久了图书馆系统就没书内存可用了。坑 2重复delete导致程序崩溃// 普通指针写法 void test() { int* p1 new int(10); int* p2 p1; // p2 和 p1 指向同一块内存 delete p1; // 释放内存 // ... 业务逻辑 delete p2; // 重复释放同一块内存程序直接崩溃 }就像你和同学都借了同一本书你先还了同学又去还一次 —— 图书馆管理员系统直接懵了程序就崩了。普通指针的问题是内存的 “申请” 和 “释放” 全靠人手动管人总会忘事、犯错 —— 而shared_ptr就是来帮你自动管内存的不用你写delete也不会重复释放。二、用生活类比秒懂shared_ptr原理shared_ptr的核心逻辑可以用「共享一本书」的例子解释你、小明、小红三个人共享一本《C 入门》书买回来时申请内存只有你在看 ——「当前看书人数」 1小明也想看你把书借给他 ——「当前看书人数」 2小红也加入 ——「当前看书人数」 3你看完了不看了 ——「当前看书人数」 2小明也看完了 ——「当前看书人数」 1小红最后看完 ——「当前看书人数」 0关键当没人看了人数 0书就被收起来释放内存。对应到shared_ptr原理shared_ptr内部有一个 **「引用计数」**就像上面的「当前看书人数」每多一个shared_ptr指向同一块内存引用计数 1每销毁一个shared_ptr比如超出作用域、被重置引用计数 -1当引用计数 0 时shared_ptr自动释放内存不用你写delete。shared_ptr两大作用自动管理内存引用计数原理释放内存共享所有权能读取同一个地方的值1. 创建shared_ptr用std::make_shared这是创建shared_ptr最安全、最常用的方式类比「去书店买一本新书」#include iostream #include memory // 必须包含这个头文件才能用 shared_ptr int main() { // 创建一个 shared_ptr指向一个存了 10 的 int 类型内存 // std::make_shared类型(初始值) —— 推荐写法 std::shared_ptrint p1 std::make_sharedint(10); // 等价于 ROS2 里的写法ROS2 封装了别名但本质一样 // rclcpp::Publisherstd_msgs::msg::String::SharedPtr publisher_; // 本质就是std::shared_ptrrclcpp::Publisher... publisher_; // 用 *p1 访问内存里的值像普通指针一样 std::cout *p1 std::endl; // 输出 10 return 0; } // 程序结束p1 超出作用域引用计数0自动释放内存2. 复制shared_ptr引用计数 1类比「把书借给同学看」复制后两个shared_ptr指向同一块内存#include iostream #include memory int main() { std::shared_ptrint p1 std::make_sharedint(10); std::cout p1 的引用计数 p1.use_count() std::endl; // 输出 1 // 复制 p1 给 p2 —— 引用计数 1 std::shared_ptrint p2 p1; std::cout p1 的引用计数 p1.use_count() std::endl; // 输出 2 std::cout p2 的引用计数 p2.use_count() std::endl; // 输出 2同一块内存计数共享 // *p1 和 *p2 访问的是同一块内存 *p2 20; std::cout *p1 std::endl; // 输出 20p1 的值也变了 return 0; } // p1 和 p2 都超出作用域引用计数从 2 减到 0自动释放内存3. 重置shared_ptr引用计数 -1类比「你看完书不看了」重置后shared_ptr不再指向原来的内存#include iostream #include memory int main() { std::shared_ptrint p1 std::make_sharedint(10); std::shared_ptrint p2 p1; // 引用计数 2 // 重置 p1 —— p1 不再指向原来的内存引用计数 -1变成 1 p1.reset(); std::cout p2 的引用计数 p2.use_count() std::endl; // 输出 1 // 重置 p2 —— 引用计数 -1变成 0自动释放内存 p2.reset(); return 0; }4. 像普通指针一样用shared_ptr*和-shared_ptr只是 “包装” 了普通指针用法完全一样#include iostream #include memory #include string // 定义一个简单的类 class Person { public: std::string name; Person(std::string n) : name(n) {} void say_hello() { std::cout Hello, Im name std::endl; } }; int main() { // 创建 shared_ptr指向 Person 对象 std::shared_ptrPerson p std::make_sharedPerson(张三); // 用 - 访问对象的成员和普通指针一样 p-say_hello(); // 输出 Hello, Im 张三 // 用 * 访问对象本身 (*p).name 李四; p-say_hello(); // 输出 Hello, Im 李四 return 0; }

相关新闻

计算机毕业设计之springboot疫情访客信息智能收集系统

计算机毕业设计之springboot疫情访客信息智能收集系统

伴随着我国社会的发展,人民生活质量日益提高。于是对疫情访客进行规范而严格是十分有必要的,所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套疫情访客信息智能收集系统,帮助社区进…

2026/5/17 8:41:03 阅读更多 →
4个完全免费的精品开源软件,第2个绝了!

4个完全免费的精品开源软件,第2个绝了!

1、QuickDesk:AI也能远程操控电脑啦远程桌面软件大家应该都用过,比如远程帮家人修电脑、远程办公之类。但QuickDesk有点不一样!它主打的是AI原生远程桌面。简单说,不只是人能远程控制电脑,AI 也可以。其内置了MCP Serv…

2026/7/3 5:10:39 阅读更多 →
探索光伏风电混合并网系统的 Simulink 仿真模型

探索光伏风电混合并网系统的 Simulink 仿真模型

光伏风电混合并网系统simulink仿真模型。 系统有光伏发电系统、风力发电系统、负载、逆变器 lcl 大电网构成。光伏系统采用扰动观察法实现mppt控制,经过boost电路并入母线;风机采用最佳叶尖速比实现mppt控制,通过三相电压型pwm变换器整流并入…

2026/5/17 10:39:31 阅读更多 →

最新新闻

中外大模型能力对比分析

中外大模型能力对比分析

中外大模型能力差距:结构性成因的深度分析属性说明文档版本v1.0撰写日期2026-07-02文档类型技术战略分析分析视角机制解释,而非榜单罗列 摘要 「国产大模型不如国外」是一个过于粗糙的命题。截至 2026 年上半年,斯坦福 HAI《AI Index 2026》指…

2026/7/3 17:52:04 阅读更多 →
GHelper:如何用开源工具彻底解放你的华硕笔记本性能潜力?

GHelper:如何用开源工具彻底解放你的华硕笔记本性能潜力?

GHelper:如何用开源工具彻底解放你的华硕笔记本性能潜力? 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivoboo…

2026/7/3 17:52:04 阅读更多 →
LENA-R8与PIC18LF45K40的嵌入式通信与精确定位方案

LENA-R8与PIC18LF45K40的嵌入式通信与精确定位方案

1. LENA-R8与PIC18LF45K40的硬件组合解析这个组合的核心价值在于将蜂窝通信与精确定位能力集成到嵌入式系统中。LENA-R8是u-blox推出的多模LTE Cat 1模块,支持14个LTE频段和4个GSM/GPRS频段,这意味着它能在全球绝大多数地区实现网络连接。其内置的u-blox…

2026/7/3 17:52:04 阅读更多 →
心电自监督分类论文分享(1)-read your heart

心电自监督分类论文分享(1)-read your heart

READING YOUR HEART 研究背景与动机 现有心电自监督学习分为对比学习、重构学习两类,但全部把心电当做普通时序信号,采用固定窗口、固定步长切割波形,存在两个核心缺陷: 丢失心电专属形态、节律特征破坏心跳间潜在语义关系 为…

2026/7/3 17:50:04 阅读更多 →
AI编程高效学习路径:从Python速成到文本分类实战

AI编程高效学习路径:从Python速成到文本分类实战

1. 为什么选择这条AI编程学习路径?我见过太多人被AI编程的学习门槛劝退。要么被复杂的数学公式吓跑,要么在环境配置阶段就耗尽耐心,还有人在工具选择上反复折腾却始终无法开始真正编码。经过三年多的AI教学实践,我总结出一条最适合…

2026/7/3 17:50:04 阅读更多 →
解锁NVIDIA显卡的色彩魔法:novideo_srgb让广色域显示器回归真实色彩

解锁NVIDIA显卡的色彩魔法:novideo_srgb让广色域显示器回归真实色彩

解锁NVIDIA显卡的色彩魔法:novideo_srgb让广色域显示器回归真实色彩 【免费下载链接】novideo_srgb Calibrate monitors to sRGB or other color spaces on NVIDIA GPUs, based on EDID data or ICC profiles 项目地址: https://gitcode.com/gh_mirrors/no/novide…

2026/7/3 17:48:03 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻