0

0

c++中std::weak_ptr的作用是什么_c++解决循环引用的智能指针用法

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-10-28 19:19:02

|

198人浏览过

|

来源于php中文网

原创

std::weak_ptr用于解决std::shared_ptr的循环引用问题,它不增加引用计数,可安全访问共享对象而不影响其生命周期。

c++中std::weak_ptr的作用是什么_c++解决循环引用的智能指针用法

在C++中,std::weak_ptr 的主要作用是配合 std::shared_ptr 使用,解决循环引用问题,同时提供一种安全访问共享资源的方式,而不会增加其引用计数。

std::weak_ptr 是什么

std::weak_ptr 是一种弱引用智能指针,它指向由 std::shared_ptr 管理的对象,但不参与引用计数。这意味着它不会延长对象的生命周期。

它通常用于打破 shared_ptr 之间的循环引用,或者作为缓存、观察者等场景中的“临时”访问手段。

循环引用问题示例

考虑两个类 A 和 B,各自持有一个指向对方的 shared_ptr:

立即学习C++免费学习笔记(深入)”;

struct B; // 前向声明

struct A {
    std::shared_ptr ptr;
    ~A() { std::cout << "A destroyed\n"; }
};

struct B {
    std::shared_ptr ptr;
    ~B() { std::cout << "B destroyed\n"; }
};

如果这样使用:

晓语台
晓语台

晓语台,是一款AI文本创作产品。创作能力主要围绕营销文本的AI创作,晓语台覆盖了品牌与市调、商业媒体、社交媒体、搜索营销、数字广告、职场办公共六类全营销文本

下载
auto a = std::make_shared();
auto b = std::make_shared();
a->ptr = b;
b->ptr = a;

此时 a 和 b 相互持有 shared_ptr,引用计数始终大于0,即使超出作用域,析构函数也不会被调用,造成内存泄漏。

用 std::weak_ptr 打破循环

只需将其中一个指针改为 weak_ptr,即可打破循环:

struct B;

struct A {
    std::shared_ptr ptr;
    ~A() { std::cout << "A destroyed\n"; }
};

struct B {
    std::weak_ptr ptr;  // 改为 weak_ptr
    ~B() { std::cout << "B destroyed\n"; }
};

这时,B 持有的是指向 A 的弱引用,不会增加 A 的引用计数。当外部的 shared_ptr 离开作用域后,A 会被正确释放,接着 B 也被释放,循环被打破。

如何使用 std::weak_ptr 访问对象

由于 weak_ptr 不保证所指对象仍然存在,必须先检查有效性:

  • 使用 lock() 方法获取一个临时的 shared_ptr
  • 如果对象还活着,返回非空 shared_ptr;否则返回 nullptr
std::shared_ptr temp = b.ptr.lock();
if (temp) {
    // 安全使用 temp
    std::cout << "Object is alive\n";
} else {
    std::cout << "Object has been destroyed\n";
}

基本上就这些。weak_ptr 不复杂,但它在管理资源生命周期和避免内存泄漏方面非常关键,尤其是在有父子结构或双向关联的场景中,合理使用 weak_ptr 能让智能指针真正“智能”。

相关专题

更多
Word 字间距调整方法汇总
Word 字间距调整方法汇总

本专题整合了Word字间距调整方法,阅读下面的文章了解更详细操作。

2

2025.12.24

任务管理器教程
任务管理器教程

本专题整合了任务管理器相关教程,阅读下面的文章了解更多详细操作。

2

2025.12.24

AppleID格式
AppleID格式

本专题整合了AppleID相关内容,阅读专题下面的文章了解更多详细教程。

0

2025.12.24

csgo视频观看入口合集
csgo视频观看入口合集

本专题整合了csgo观看入口合集,阅读下面的文章了知道更多入口地址。

29

2025.12.24

yandex外贸入口合集
yandex外贸入口合集

本专题汇总了yandex外贸入口地址,阅读下面的文章了解更多内容。

58

2025.12.24

添加脚注通用方法
添加脚注通用方法

本专题整合了添加脚注方法合集,阅读专题下面的文章了解更多内容。

1

2025.12.24

重启电脑教程汇总
重启电脑教程汇总

本专题整合了重启电脑操作教程,阅读下面的文章了解更多详细教程。

3

2025.12.24

纸张尺寸汇总
纸张尺寸汇总

本专题整合了纸张尺寸相关内容,阅读专题下面的文章了解更多内容。

5

2025.12.24

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

1

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.2万人学习

C 教程
C 教程

共75课时 | 3.6万人学习

C++教程
C++教程

共115课时 | 9.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号