新闻中心

C++怎么使用智能指针shared_ptr_C++现代内存管理与shared_ptr原理剖析

2025-11-22
浏览次数:
返回列表
shared_ptr通过引用计数管理对象生命周期,避免内存泄漏;需包含头文件,推荐用make_shared创建,支持多指针共享同一对象,引用归零时自动释放资源;注意循环引用、裸指针混用等问题,适用共享所有权场景。

c++怎么使用智能指针shared_ptr_c++现代内存管理与shared_ptr原理剖析

在C++中,shared_ptr 是现代内存管理的重要工具之一,属于智能指针的一种。它通过引用计数机制自动管理动态分配对象的生命周期,有效避免内存泄漏和重复释放问题。

shared_ptr 的基本用法

要使用 shared_ptr,需要包含头文件 。它的核心思想是多个 shared_ptr 可以共享同一个对象,当最后一个 shared_ptr 被销毁时,所指向的对象会自动被删除。

创建 shared_ptr 的常用方式:

  • 使用 make_shared:推荐方式,性能更好且异常安全。
  • 直接构造:传入 new 返回的原始指针(不推荐裸 new,易出错)。
示例代码:
#include <memory>
#include <iostream>

int main() {
    // 推荐:使用 make_shared
    auto ptr1 = std::make_shared<int>(42);
    
    // 多个 shared_ptr 共享同一对象
    auto ptr2 = ptr1;
    auto ptr3 = ptr1;

    std::cout << "Value: " << *ptr1 << "\n";
    std::cout << "Reference count: " << ptr1.use_count() << "\n"; // 输出 3

    ptr2.reset(); // ptr2 不再指向对象
    std::cout << "After reset, count: " << ptr1.use_count() << "\n"; // 输出 2

    return 0;
}

shared_ptr 的原理剖析

shared_ptr 内部维护两个关键部分:

  • 指向实际对象的指针
  • 控制块(control block):包含引用计数、弱引用计数和自定义删除器等信息

每次拷贝 shared_ptr,引用计数加1;每次析构或 reset,引用计数减1。归零时自动释放资源。

控制块通常与对象一起分配(如 make_shared 可优化),也可单独分配(如用裸指针构造时)。

CA.LA CA.LA

第一款时尚产品在线设计平台,服装设计系统

CA.LA 94 查看详情 CA.LA

常见陷阱与注意事项

虽然 shared_ptr 很强大,但使用不当仍可能引发问题:

  • 循环引用:两个对象互相持有对方的 shared_ptr,导致引用计数永不归零。应使用 weak_ptr 打破循环。
  • 不要混用裸指针和 shared_ptr:避免对 shared_ptr 管理的对象使用 delete 或多次构建 shared_ptr。
  • 避免从 this 创建 shared_ptr:应在类内使用 enable_shared_from_this 来安全地生成 shared_ptr。

性能与适用场景

shared_ptr 带来便利的同时也有开销:

  • 引用计数的原子操作在多线程下有性能成本
  • 控制块额外内存占用

适用于需要共享所有权的场景,比如缓存、观察者模式、多线程间共享数据等。若仅单个所有者,优先考虑 unique_ptr。

基本上就这些。合理使用 shared_ptr 能大幅提升代码安全性和可维护性,理解其原理有助于写出更高效、更健壮的 C++ 程序。

以上就是C++怎么使用智能指针shared_ptr_C++现代内存管理与shared_ptr原理剖析的详细内容,更多请关注其它相关文章!


# 有什么区别  # 小企业营销推广 重庆  # 合肥seo公司加盟电话  # 清流外贸网站建设  # 服饰网站推广工作内容  # 重庆seo排名电话  # 烟台正规网站优化  # 台州网站推广工作  # 泉州洛江网站推广优化  # 宜春专业网站建设优化  # 定南seo网络营销优点  # 适用于  # 也有  # 头文件  # 工具  # 零时  # 多个  # 内存管理  # 如何实现  # 多线程  # 如何使用  # red  # 内存占用  # stream  # ios  # c++  # ai 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享  html5 app怎么运行环境_配html5 app运行环境【教程】  J*a递归快速排序中静态变量导致数据累积的陷阱与解决方案  智慧团建扫码登录入口 智慧团建扫码登录入口官网版​  C#如何安全地从用户上传的XML文件中读取数据? 验证与清理策略  qq游戏网页版直接玩_qq游戏免下载快速入口  拼多多赚钱渠道_拼多多收益来源  CSS布局中意外空白:解决padding-top导致的顶部间距问题  Selenium Python中处理点击后新窗口加载冻结问题的策略与实践  移动端XML文件怎么转换成Excel 手机和平板上的解决方案  在Typer应用中优雅地处理和重组任意命令行参数  如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit  Win11怎么关闭触摸屏_Windows 11禁用HID符合标准触摸屏  Python多版本共存与虚拟环境管理深度指南  使用J*aScript检测输入元素是否包含在特定类中  印象笔记怎样用批量导出备知识库_印象笔记用批量导出备知识库【备份方法】  使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战  Win11文件资源管理器卡顿怎么修 Win11重置资源管理器进程优化响应速度【修复方法】  163邮箱注册官网 免费申请163个人邮箱  高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】  SteamMachine定价或为699美元 大家想入手吗?  Yandex免登录网页版地址 Yandex搜索引擎官方访问入口  冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法  顺丰快递查单号物流信息 顺丰快递小程序查询入口  “音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!  J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明  css绝对定位元素脱离父容器怎么办_确保父元素position非static  C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言  俄罗斯方块最新版入口 俄罗斯方块在线玩官网入口  拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达  谷歌google账号注册详细步骤 谷歌账号注册官方教程  Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】  想当下一个《2077》?《心之眼》Steam评价升至"多半好评"  ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接  解决macOS Tkinter应用双击启动崩溃:PyInstaller打包指南  钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法  飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】  MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复  支付宝如何设置安全保护_支付宝安全设置的全面教程  J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析  Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑  Animex动漫社网入口地址 Animex动漫社网正版在线入口  sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE  J*aScript中向JSON对象添加新属性的正确姿势  Node.js CSV 数据处理:基于字段值条件过滤整条记录的策略  蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台  AO3官方镜像站点汇总 AO3同人作品网页版直达链接  TikTok国际版网页端快速入口 TikTok全球版短视频浏览教程  Excel文件在线转换快速入口 Excel在线格式转换网站  vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法 

搜索