新闻中心

c++怎么使用智能指针weak_ptr_c++中weak_ptr的作用与用法示例

2025-11-05
浏览次数:
返回列表
weak_ptr用于解决shared_ptr循环引用问题,如两个shared_ptr相互引用导致内存泄漏,通过将其中一个改为weak_ptr可打破循环,不增加引用计数,仅在需要时用lock提升为shared_ptr访问对象。

c++怎么使用智能指针weak_ptr_c++中weak_ptr的作用与用法示例

weak_ptr 是 C++ 中用于解决 shared_ptr 循环引用问题的智能指针。它不增加对象的引用计数,只是一个“弱”引用,用来观察由 shared_ptr 管理的对象是否还存在。

weak_ptr 的作用

当两个或多个 shared_ptr 相互持有对方时,会形成循环引用,导致内存无法释放。例如:

// 错误示例:循环引用 struct Node { std::shared_ptr parent; std::shared_ptr child; };

如果 parent 指向 child,child 又通过 parent 成员指向父节点,引用计数永远不为 0,析构函数不会调用,造成内存泄漏。

使用 weak_ptr 可打破这种循环。它不参与引用计数,只在需要时临时提升为 shared_ptr 来访问对象。

基本用法与操作

weak_ptr 常见操作包括构造、提升为 shared_ptr(lock)、检查对象是否存活(expired)等。

刺鸟创客 刺鸟创客

一款专业高效稳定的AI内容创作平台

刺鸟创客 110 查看详情 刺鸟创客 std::shared_ptr sp = std::make_shared(42); std::weak_ptr wp = sp; // 从 shared_ptr 构造 weak_ptr // 使用 lock 提升为 shared_ptr if (auto temp = wp.lock()) { std::cout

实际应用示例:双向链表或树结构

常见于有父子关系的结构中,父节点用 shared_ptr 管理子节点,子节点用 weak_ptr 回指父节点。

#include #include struct TreeNode; using NodePtr = std::shared_ptr; using WeakPtr = std::weak_ptr; struct TreeNode { int value; NodePtr left, right; WeakPtr parent; // 防止循环引用 TreeNode(int v) : value(v) {} ~TreeNode() { std::cout parent = parent; // weak_ptr 自动从 shared_ptr 赋值 } int main() { auto root = std::make_shared(1); auto left = std::make_shared(2); root->left = left; setParent(left, root); // 通过 weak_ptr 访问父节点 if (auto p = left->parent.lock()) { std::cout value

在这个例子中,left 节点通过 weak_ptr 弱引用父节点,不会影响 root 的引用计数,因此当 main 结束时,所有对象都能被正确释放。

基本上就这些。weak_ptr 不复杂但容易忽略,关键在于识别可能的循环引用场景,并用它来“断环”。

以上就是c++++怎么使用智能指针weak_ptr_c++中weak_ptr的作用与用法示例的详细内容,更多请关注其它相关文章!


# 之心  # 影视聚合seo  # 吴江网站优化哪家好  # 南城网站优化哪家专业  # 正己酸网站建设批发基地  # 推广营销实施方案  # 扬州湛江网站seo优化方案  # 如何做一个体育网站推广  # 西秀区营销网络推广中心  # 佛山seo首页排名优化  # 西安营销推广招商  # 解决问题  # node  # 中文网  # 相关文章  # 都能  # 多个  # 在这个  # 与其他  # 如何使用  # 它不  # red  # c++ 


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


相关推荐: 腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程  谷歌google账号注册详细步骤 谷歌账号注册官方教程  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技  必由学登录入口 必由学官方网站在线访问链接  C++ map遍历方法大全_C++ map迭代器使用总结  TikTok评论显示延迟如何处理 TikTok评论刷新优化方法  从OpenAI API响应中高效提取生成文本  深入理解J*a合成构造器:何时以及为何阻止其生成  CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略  QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口  c++ 命名空间怎么用 c++ namespace使用指南  TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法  如何使用Go和Martini动态服务解码后的图片  蛙漫安全无毒 官方认证的绿色入口  利用5118提升短视频内容效果_5118短视频关键词优化方法  2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示  C++指针和引用有什么区别_C++内存管理核心概念深度解析  天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南  拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧  Win11怎么修改默认浏览器_Windows 11设置Chrome为默认  Golang如何优雅处理error_Golang error处理最佳实践总结  4399网页游戏电脑版全新入口 4399电脑端在线玩指南  优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践  照顾宝贝2小游戏免费秒玩入口  HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制  Golang如何实现容器化日志收集与分析_Golang容器日志收集分析方法  为什么简单的XML文件也会解析失败? 检查隐藏的非打印字符(如BOM)的方法  俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口  Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】  Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  在J*a项目里如何构建对象之间的契约_接口约束的实际落地  怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】  msn官网入口地址手机版 msn官方网站手机最新链接  Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践  Yandex免登录网页版地址 Yandex搜索引擎官方访问入口  Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】  实现全屏滚动与导航点:专业教程  深入理解J*aScript Promise异步执行与微任务队列  如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略  AO3访问入口汇总 AO3网页版同人作品一键直达  J*a里如何使用N*igableMap进行导航操作_可导航Map操作技巧解析  在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验  12306选座怎么选到特殊座位_12306特殊座位选择注意事项  J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题  微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法  Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明  妖精动漫免费平台 妖精动漫官网资源观看网址  提升Kafka消费者健壮性:会话超时处理与消息处理语义 

搜索