新闻中心

C++ shared_ptr用法_C++智能指针详解

2025-11-29
浏览次数:
返回列表
shared_ptr通过引用计数管理动态内存,多个指针共享对象所有权,使用make_shared创建更安全,引用计数为0时自动释放内存,需用weak_ptr避免循环引用。

c++ shared_ptr用法_c++智能指针详解

在C++中,shared_ptr 是一种智能指针,用于管理动态分配的对象,确保对象在不再被使用时自动释放内存。它通过引用计数机制实现共享所有权,多个 shared_ptr 可以指向同一个对象,当最后一个指向该对象的 shared_ptr 被销毁或重置时,对象才会被自动删除。

1. shared_ptr 的基本用法

要使用 shared_ptr,需要包含头文件 memory

#include

创建一个 shared_ptr 的常见方式是使用 std::make_shared,这是推荐的做法,因为它更高效且异常安全:

std::shared_ptr ptr = std::make_shared(42);

也可以从原始指针构造(不推荐直接使用裸指针):

std::shared_ptr ptr2(new int(10)); // 不推荐,但合法

2. 引用计数与共享所有权

shared_ptr 内部维护一个引用计数,记录有多少个 shared_ptr 实例共享同一个对象。每次拷贝会增加计数,每次析构或赋值会减少计数。

查看当前引用计数的方法是调用 use_count()

auto p1 = std::make_shared(100);
auto p2 = p1; // 引用计数变为 2
std::cout

当引用计数降为 0 时,所管理的对象会被自动 delete。

N世界 N世界

一分钟搭建会展元宇宙

N世界 138 查看详情 N世界

3. 避免循环引用

使用 shared_ptr 时需小心循环引用问题。例如两个对象互相持有对方的 shared_ptr,会导致引用计数永远不为 0,造成内存泄漏。

解决办法是使用 std::weak_ptr 打破循环。它是一个弱引用,不增加引用计数:

std::shared_ptr a = std::make_shared();
a->buddy = a; // buddy 是 weak_ptr

访问 weak_ptr 前需调用 lock() 获取临时的 shared_ptr

4. shared_ptr 的常用操作

shared_ptr 支持大多数指针操作:

  • *ptr:解引用,获取对象
  • ptr->func():调用成员函数
  • ptr.get():获取原始指针(慎用)
  • ptr.reset():释放所有权,可传新指针
  • ptr.use_count():返回引用计数(调试用)

基本上就这些。合理使用 shared_ptr 能有效避免内存泄漏,提升代码安全性。注意避免循环引用,优先使用 make_shared,不要混用裸指针和智能指针。不复杂但容易忽略细节。

以上就是C++ shared_ptr用法_C++智能指针详解的详细内容,更多请关注其它相关文章!


# 相关文章  # 微营销推广软件哪个好做  # 如何运营好sem营销seo  # 建设网站培训方案范文  # 安丘网站优化推广价格  # DOTA网站建设游戏app  # 跃进村网站推广优化  # 闵行区创意营销推广  # 网站视频推广公司排名榜  # 山东网站推广步骤  # 速卖通站外营销推广  # 中文网  # c++智能指针  # 它是  # 才会  # 是一种  # 内存管理  # 这是  # 如何实现  # 多个  # 有什么  # red  # c++ 


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


相关推荐: 虫虫漫画精品漫画官网_虫虫漫画精品漫画官网进入精品漫画  win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口  微博网页版首页入口 微博电脑端官网登录链接  Excel组合图表怎么做 Excel创建柱状图与折线组合图教程【图表】  mcjs网页版流畅运行 mcjs低配电脑畅玩入口  Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】  深入理解Promise链:如何在catch后中断then的执行  J*a 递归快速排序中静态变量的状态管理与陷阱  怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】  Lar*el DB::listen 事件中的查询执行时间单位解析  J*aScript实现动态背景色下的文本与按钮颜色自适应调整  uc浏览器网页版极速入口 uc网页浏览器网页版流畅体验  汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口  Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程  vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法  QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口  mc.js官网登录入口 mc.js官方登录入口最新版  整合Supabase认证与Django模型:跨模式迁移的解决方案  三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】  QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台  漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口  c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解  搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具  Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口  可靠CSGO开箱平台解析 CSGO开箱网合集  如何在Promise链中优雅地中断后续then执行  护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?  抖音网页版企业服务中心登录入口_抖音网页版企业登录平台  Python多版本共存与虚拟环境管理深度指南  在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析  steam官方入口大全 steam账号注册及操作指南  解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException  三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升  蛙漫移动版在线看 蛙漫手机浏览器直达入口  《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!  Golang如何安装Swagger工具_GoSwagger文档生成环境  谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作  解决移动端滚动问题的overflow属性应用指南  Typer应用中动态命令行参数的解析与处理  解决Bootstrap卡片顶部边距导致背景图下移的问题  Python字典中优雅地迭代剩余元素的方法  如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践  sublime怎么预览Markdown渲染效果_Markdown Preview插件 for sublime教程  顺丰国际快递查询 国际件官方查询入口  CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色  淘宝支付提示失败如何解决 淘宝支付流程优化方法  NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略  天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南 

搜索