恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

深入理解C++ 智能指针std::shared_ptr<一>各种构造方法

  • 首页
  • 资讯中心
  • /
  • 深入理解C++ 智能指针std::shared_ptr<一>各种构造方法

相关资讯

用好 Python 上下文管理器:contextlib 让你少写一半 with 代码 2026/8/23 23:56:18
自动化运维-从零开始编写ansible剧本(二) 2026/8/23 23:56:18
XHS-Downloader 批量下载:命名格式 + 按作者归档,配一次就不用再管 2026/8/23 23:51:18

最新资讯

论文AI率过高怎么办?2026年12款免费降AI率工具实测指南
Marketch:从Sketch画板直接量取CSS
如何在ThinkPad X390上安装macOS:OpenCore EFI完整指南
WechatHook 终极指南:5大核心能力详解,3分钟看懂微信自动化
OpenModScan:免费跨平台 Modbus 主站调试工具,让现场通讯验证一键搞定
从省级培育直达国家级绿色工厂:开源能碳平台打通工信部 12 项标准 + 十五五新型电力系统全落地路径

今日推荐

OpenModScan:免费跨平台 Modbus 主站调试工具,让现场通讯验证一键搞定
WechatHook 终极指南:5大核心能力详解,3分钟看懂微信自动化
如何在ThinkPad X390上安装macOS:OpenCore EFI完整指南

本周热门

Nextcloud 桌面客户端:把同步交给它,你只管改文件
如何将 HTML 转成 Word 文档且格式不丢失?html-to-docx 使用教程
Anki 批量操作卡片完整指南:一次搞定上千张,不再逐张修改

本月精选

如何用DamaiHelper实现演唱会门票的智能自动化抢购:完整技术解决方案指南
第4篇:59 倍性能差距的索引瓶颈定位——一次教科书级的全表扫描调优
终极歌词批量下载神器:5分钟解决离线音乐库歌词同步难题

深入理解C++ 智能指针std::shared_ptr<一>各种构造方法

发布时间:2026/8/23 23:56:18
深入理解C++ 智能指针std::shared_ptr<一>各种构造方法 构造方式代码示例特点与说明默认构造std::shared_ptrT p;构造一个空的智能指针不管理任何资源。裸指针构造std::shared_ptrT p(new T(args));直接传入new出来的裸指针。不推荐异常不安全且容易误操作仅用于兼容旧代码。工厂构造最推荐auto p std::make_sharedT(args);单次内存分配对象控制块性能最高异常安全。日常开发首选。拷贝构造std::shared_ptrT p2(p1);共享所有权引用计数 1。移动构造std::shared_ptrT p2(std::move(p1));转移所有权引用计数不变p1变为空。从unique_ptr构造std::shared_ptrT p(std::move(uniquePtr));将独占指针转为共享指针转移所有权。自定义删除器std::shared_ptrT p(new T, deleter);释放资源时调用自定义函数如关闭文件句柄。可以参照下面示例:#include iostream #include memory // 辅助类用来观察构造和析构的日志 class MyClass { public: int id; explicit MyClass(int i) : id(i) { std::cout MyClass [ id ] 构造 std::endl; } ~MyClass() { std::cout MyClass [ id ] 析构 std::endl; } void greet() const { std::cout Hello from MyClass id std::endl; } }; int main() { std::cout 1. 默认构造空指针 std::endl; std::shared_ptrMyClass empty; // 空 if (!empty) { std::cout empty 是空指针 std::endl; } std::cout \n 2. make_shared 构造推荐 std::endl; auto sp1 std::make_sharedMyClass(10); // 只分配一次内存 std::cout sp1 引用计数: sp1.use_count() std::endl; // 1 sp1-greet(); std::cout \n 3. 拷贝构造共享所有权 std::endl; auto sp2 sp1; // 拷贝引用计数 1 std::cout 拷贝后 sp1 计数: sp1.use_count() std::endl; // 2 std::cout 拷贝后 sp2 计数: sp2.use_count() std::endl; // 2 std::cout \n 4. 移动构造转移所有权 std::endl; auto sp3 std::move(sp1); // sp1 变为空所有权给 sp3 std::cout 移动后 sp1 是否为空: (sp1 ? 否 : 是) std::endl; std::cout 移动后 sp3 计数: sp3.use_count() std::endl; // 2 (sp2 sp3) std::cout \n 5. 从裸指针构造不推荐仅演示 std::endl; std::shared_ptrMyClass sp4(new MyClass(20)); std::cout sp4 计数: sp4.use_count() std::endl; std::cout \n 6. 从 unique_ptr 转换 std::endl; auto uniquePtr std::make_uniqueMyClass(30); std::shared_ptrMyClass sp5 std::move(uniquePtr); // uniquePtr 转为 shared_ptr std::cout sp5 计数: sp5.use_count() std::endl; std::cout \n 7. 自定义删除器lambda std::endl; std::shared_ptrMyClass sp6(new MyClass(40), [](MyClass* p) { std::cout 自定义删除器: 释放 MyClass p-id std::endl; delete p; }); std::cout \n--- 主函数即将结束所有指针将自动析构 --- std::endl; // 注意sp1 已经为空sp2/sp3/sp4/sp5/sp6 会在退出作用域时自动释放内存。 return 0; }

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号