当前位置: 首页 > news >正文

C++——智能指针 weak_ptr

weak_ptr这个指针天生一副小弟的模样,也是在C++11的时候引入的标准库,它的出现完全是为了弥补它老大shared_ptr天生有缺陷的问题。只能配合shared_ptr一起使用

shared_ptr 循环引用造成的后果:存在资源泄露

 一、shared_ptr 的循环引用

什么是循环引用的问题呢?在shared_ptr的使用过程中,当强引用计数为0时,就会释放所指向的堆内存。那么问题来了,如果和死锁一样,当两个shared_ptr互相引用,那么它们就永远无法被释放了。

struct ListNode
{int _data;shared_ptr<ListNode> _prev;shared_ptr<ListNode> _next;~ListNode() { cout << "~ListNode()" << endl; }
};
int main()
{shared_ptr<ListNode> node1(new ListNode);shared_ptr<ListNode> node2(new ListNode);node1->_next = node2;node2->_prev = node1;return 0;
}

以上代码运行,检测到如下内存泄露:

分析:定义出来的sp1和sp2都有如下的结构, 首先sp1是一个智能指针shared_ptr,所以它有它的_ptr和_pCount字段,其次ListNode结构的结点内部有三个成员变量,分别为data next prev,而且这个next和prev它俩也是俩个shared_ptr智能指针对象,也有其自己的_ptr和_pCount,于是定义出来的sp1对象就有如下的结构。sp2结构也和此图一致。

 经过如下的链接操作后:形成如下图的链接结构。

    node1->_next = node2;node2->_prev = node1;

随后,程序执行结束,进入到对象的析构环节,后创建的元素先析构,先进行sp2对象的析构,根据shared_ptr计数功能,对右边计数器进行--操作,发现计数器无法归零,所以不能对sp2资源进行释放,转而进行sp1对象的析构处理,但是对左侧计数器进行--操作后,发现仍然不能归零,俩个对象中的next和prev分别造成了不同计数器的无法归零,就导致内存泄露,资源无法回收。

二、weak_ptr 解决循环引用

标准库提供了weak_ptr,唯一作用就是帮助shared_ptr解决循环引用的问题

weak_ptr不能管理资源,只能配合shared_ptr一起使用。

如此修改之后,俩个对象正常进行析构,并且没有产生资源泄露。

 三、为什么weak_ptr能解决这个问题?

未完待续

http://www.lqws.cn/news/122293.html

相关文章:

  • Java多线程:ThreadPoolTaskExecutor线程池 与CompletableFuture如何打出组合拳
  • Redisson - 实现延迟队列
  • [特殊字符] 深度剖析 n8n 与 Dify:使用场景、优劣势及技术选型建议
  • DA14531_beacon_大小信标设备开发
  • mysql 悲观锁和乐观锁(—悲观锁)
  • 电路设计基础-2
  • Redis-旁路缓存策略详解
  • JSON基础知识
  • Java 线程池原理详解
  • 分布式互斥算法
  • 使用ArcPy进行栅格数据分析
  • Axios 取消请求的演进:CancelToken vs. AbortController
  • rknn优化教程(一)
  • 海信IP810N-海思MV320芯片-安卓9-2+16G-免拆优盘卡刷固件包
  • 瀚文机械键盘固件开发详解:HWKeyboard.cpp文件解析与应用
  • Async-profiler 内存采样机制解析:从原理到实现
  • Docker慢慢学
  • Java 中 ArrayList、Vector、LinkedList 的核心区别与应用场景
  • 【Docker 从入门到实战全攻略(二):核心概念 + 命令详解 + 部署案例】
  • Spring Boot 从Socket 到Netty网络编程(下):Netty基本开发与改进【心跳、粘包与拆包、闲置连接】
  • java从azure中读取用户信息
  • Docker 常用命令详解
  • docker生命周期
  • Elasticsearch的搜索流程描述
  • 微软的新系统Windows12未来有哪些新特性
  • Python 隐藏法宝:双下划线 _ _Dunder_ _
  • stripe支付测试,ngrok无法使用?免费vscode端口转发,轻松简单!
  • Java Lombok @Data 注解用法详解
  • 打卡Day44
  • 吴恩达机器学习讲义概述