关于智能指针的补充1(share_ptr、weak_ptr 相互配合使用)

news2024/11/26 11:36:55

0

关于智能指针的补充1

  • 1.share_ptr存在的问题
  • 2.weak_ptr
    • 2.1介绍
    • 2.2weak_ptr 核心代码逻辑

1.share_ptr存在的问题

先看这样一段代码

#define _CRT_SECURE_NO_WARNINGS
using namespace std;
#include"smartptr.h"
struct ListNode
{
	GXPYY::shared_ptr<ListNode> _next=nullptr;
	GXPYY::shared_ptr<ListNode> _prev=nullptr;

	int _val = 0;

	~ListNode()
	{
		cout << "~ListNode()" << endl;
	}
};
template<class T>
void test()
{
	GXPYY::shared_ptr<ListNode>sp1(new ListNode);
	GXPYY::shared_ptr<ListNode>sp2(new ListNode);
	//sp1->_next = sp2;
	//sp2->_prev = sp1;


}

int main()
{	
	test<ListNode>();
	
	return 0;
}

pic 1
上述的代码中我们定义了一个双向链表,但是没有链接结点,编译的时候正常运行,正常析构,并没有出现内存泄漏的情况。接下来我们尝试链接:pic 2
链接之后我们发现,出现了内存泄漏,函数的生命周期结束之后并没有进行析构变量,造成的原因是:引用循环(Reference cycles)

pic4
相互依赖,导致循环引用。

2.weak_ptr

2.1介绍

  • std::weak_ptr是C++标准库中的智能指针类型,用于解决std::shared_ptr可能出现的循环引用问题。它提供了一种非拥有(non-owning)的观测指针,允许观测被std::shared_ptr管理的对象,但不会增加引用计数。

  • std::weak_ptr的核心思想是通过弱引用(weak reference)来解决循环引用问题。当存在std::shared_ptr之间的循环引用时,循环中的对象无法被正常释放,因为它们的引用计数无法降为零。这时可以使用std::weak_ptr来打破循环引用,因为std::weak_ptr不会增加引用计数,也不会影响资源的生命周期。

  • 使用std::weak_ptr需要配合std::shared_ptr一起使用,通过std::shared_ptr的构造函数或std::shared_ptr::weak_ptr成员函数来创建。通std::weak_ptr可以检查对象是否还存在,以及获取对对象的强引用(通过调用 std::weak_ptr::lock()返回一个有效的std::shared_ptr)。

  • 当需要访问由std::weak_ptr观测的对象时,应该先使std::weak_ptr::lock()来获取对应的std::shared_ptr,然后再进行访问。如果std::weak_ptr观测的对象已经被销毁,则std::weak_ptr::lock()将返回一个空的std::shared_ptr,可以用于检查对象是否存在。

  • 通过使用std::weak_ptr,可以避免循环引用导致的资源泄漏,同时提供了一种安全的方式来观测被std::shared_ptr管理的对象,而不影响资源的生命周期。

总的来说 weak_ptr只指向资源 但是不参与释放管理

我们简单实现一下weak_ptr

2.2weak_ptr 核心代码逻辑

  • 代码
// 不参与指向资源的释放管理
	template<class T>
	class weak_ptr
	{
	public:
		weak_ptr()
			:_ptr(nullptr)
		{}

		weak_ptr( shared_ptr<T>& sp)
			:_ptr(sp.get())
		{}

		weak_ptr<T>& operator=(const shared_ptr<T>& sp)
		{
			if (_ptr != sp.get())
			{
				_ptr = sp.get();
			}

			return *this;
		}

		// 像指针一样
		T& operator*()
		{
			return *_ptr;
		}

		T* operator->()
		{
			return _ptr;
		}

		

	public:
		T* _ptr;
	};

可以 看到 他是配合share_ptr使用的。

现在我们换成weak_ptr来重新编译下代码

  • 代码
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
#include"smartptr.h"
struct ListNode
{
	GXPYY::weak_ptr<ListNode> _next;
	GXPYY::weak_ptr<ListNode> _prev;

	int _val = 0;

	~ListNode()
	{
		cout << "~ListNode()" << endl;
	}
};
template<class T>
void test()
{
	GXPYY::shared_ptr<ListNode>sp1(new ListNode);
	GXPYY::shared_ptr<ListNode>sp2(new ListNode);
	sp1->_next = sp2;
	sp2->_prev = sp1;


}

int main()
{	
	test<ListNode>();
	
	return 0;
}

pic 4
正常运行 解决了内存泄漏问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/662698.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity核心3——2D物理系统

一、刚体 Rigid Body 2D ​ 刚体是物理系统中用于帮助我们进行模拟物理碰撞中力的效果的 ​ 2D 物理系统中的刚体和 3D 中的刚体基本是一样的&#xff0c;最大的区别是对象只会在 XY 平面中移动&#xff0c;并且只在垂直于该平面的轴上旋转 ​ 不同于 3D 刚体&#xff0c;2D…

【Vue2】PaginationSelect 带分页和搜索功能的下拉列表组件

1. 效果图 2. 组件完整代码 <template><div class"pagination-select"><el-selectv-model"selectedValue":style"{ width: width || 100% }"v-bind"attrs":remote-method"remoteMethod":loading"loadi…

【好书精读】网络是怎样连接的 向 DNS 服务器查询 Web 服务器的 IP 地址

&#xff08;该图由AI制作 学习AI绘图 联系我&#xff09; 目录 IP 地址的基本知识 实际的 IP 地址 域名和 IP 地址并用的理由 Socket 库提供查询 IP 地址的功能 通过解析器向 DNS 服务器发出查询 解析器的内部原理 IP 地址的基本知识 生成 HTTP 消息 根据域名查询 …

(嵌入式)TMS5700432BPZQQ1R、SPC58EC80E5QMC1X微控制器IC中文数据

TMS5700432BPZQQ1R 32位RISC闪存微控制器是设计用于安全系统的高性能汽车级微控制器。其采用的安全架构包括锁步中的双CPU、CPU和内存内置自检 (BIST) 逻辑、闪存和数据SRAM上的ECC、外设存储器上的奇偶校验以及外设I/O上的回路功能。TMS570LS0432/0332器件集成了ARM Cortex-R4…

孤立森林详解

基本概念 孤立森林&#xff08;Isolation Forest&#xff09;是一种基于异常检测的机器学习算法&#xff0c;用于识别数据集中的异常点。孤立森林算法在异常检测、网络入侵检测、金融欺诈检测等领域有广泛应用&#xff0c;并且在处理大规模数据和高维数据时表现出色。孤立森林…

了解不一样的Sui NFT标准

Sui的设计赋予非同质化Token&#xff08;NFT&#xff09;在灵活性、组合性和可交易性方面独特的属性&#xff0c;使NFT不仅仅代表指向图像的数字记录&#xff0c;还可以成为图像本身。这些NFT可以被修改或与其他NFT合并&#xff0c;以创造出可扩展的艺术作品。同时&#xff0c;…

分布式事务解决方案Seata谁建议你用的?

一、名词解释&#xff1a; TC (Transaction Coordinator) - 事务协调者 维护全局/分支事务的状态&#xff0c;驱动全局事务的提交与回滚 TM (Transaction Manager) - 事务管理器 定义全局事务的范围&#xff1a;开启、提交、回滚全局事务 RM (Resource Manager) - 资源管理…

云原生之深入解析如何使用Prometheus扩展Kubernetes调度器

一、kubernetes 调度配置 ① Scheduler Configuration kube-scheduler 提供了配置文件的资源&#xff0c;作为给 kube-scheduler 的配置文件&#xff0c;启动时通过 --config 来指定文件。目前各个 kubernetes 版本中使用的 KubeSchedulerConfiguration 为&#xff1a; 1.21 …

面试专题:spring

涉及到spring的问题都离不开IOC和AOP.AOP实现原理、动态代理和静态代理、Spring IOC的初始化过程、IOC原理、自己怎么实现一个IOC容器&#xff1f; 这些东西都是经常会被问到的。 IOC是什么&#xff1a; Ioc即控制反转&#xff0c;把原来的代码里需要实现的对象创建&#xff…

使用conda安装配置python环境

使用conda安装配置python环境 下载 我这里下载的是2-4.7.12.1&#xff0c;具体可以参考如下地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/ wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda2-4.7.12.1-Linux-x86_64.s…

d3dcompiler_47.dll缺失怎么修复?那个方法修复更简单

再运行游戏或者ps等软件&#xff0c;计算机系统提示找不到d3dcompiler_47.dll是怎么回事&#xff1f;相信困扰着不少小伙伴&#xff0c;其实d3dcompiler_47.dll是Microsoft 的 DirectX 11核心组件之一&#xff0c;它主要用于编译和运行 Direct3D 11应用程序和游戏。如果文件丢失…

编译安装LAMP

一、Apache网站服务&#xff1a; 1. Apache的起源&#xff08;多系统兼容&#xff09;&#xff1a; Apache HTTPD Server 简称 Apache&#xff0c;是 Apache 软件基金会的一个开源的网页服务器&#xff0c; 可以在大多数计算机操作系统中运行&#xff0c;由于其多平台和安全性…

美国国家量子计划咨询委员会发布更新国家量子计划建议

​ &#xff08;图片来源&#xff1a;网络&#xff09; 耗资12亿美元的美国国家量子计划&#xff08;NQI&#xff09;于2018年12月颁布&#xff0c;该计划为期10年&#xff0c;现在将开展审查前五年的活动&#xff0c;并对今后五年的推进计划提出建议。为此&#xff0c;美国国…

[经验]PMP快速通过指南

我的备考经验&#xff1a; 1一阶段&#xff1a;铺底&#xff0c;花费时间1.5周左右 主要是熟悉考试框架和内容&#xff0c;通过看网盘资料里的章节重点解析视频课后习题。 先看框架你就很清楚的了解下来&#xff0c;PMP考试把项目管理的过程拆解成了5大过程组&#xff08;启…

压力测试-JMeter安装、入门、结果分析

目录 1.写在前面 2.常用压测工具 3.压测机环境准备&#xff1a;JMeter部署 3.1 JMeter下载安装&启动&配置 3.2 入门案例 3.2.3、压测结果解释 3.2.4、线程属性参数原理 1.写在前面 等到服务上线后&#xff0c;在业务压力的冲击下&#xff0c;会发现程序运行非常…

CATIA和SolidWorks孰强孰弱?对比一下就知

寻找合适的 CAD 程序可能会很棘手&#xff0c;因为它是一种您将投资并使用的工具&#xff0c;您需要确保做出正确的决定。这篇文章将用于帮助区分 CATIA 和SOLIDWORKS之间的差异&#xff0c;以帮助您确定两者中哪一个最适合您的业务。 谁使用 CATIA&#xff1f; CATIA 于 198…

Selenium教程__环境安装(1)

Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 Selenium基本上支持主流的浏览器&#xff0c;包括IE&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Google Chrome&#xff0c;Opera等。 …

请求与响应

设置映射路径 在不同的bean中可能会出现相同名字的路径&#xff0c;这样的情况会产生冲突&#xff0c;为了解决这个冲突我们可以设置模块名作为请求路径前缀 Controller RequestMapping("/book") public class BookController {//设置当前操作的访问路径RequestMa…

Rust语言从入门到入坑——(4)Rust语法(下)

文章目录 0 引入1、结构体1. 1 结构体1. 2 结构体方法1. 3 元组结构体 2、枚举类2.1 match2.2 Option 枚举类 3、集合3.1 向量&#xff08;Vector&#xff09;3.2 字符串&#xff08;String&#xff09;3.1 映射表&#xff08;Map&#xff09; 4、总结 0 引入 在这里我们需要介…

DOM4J解析web.xml文件,实例化Servlet

1、DOM4J解析web.xml文件实例化Servlet 原理分析&#xff1a;我们解析用户在地址栏中输入的地址信息如add.do,用这个地址去web.xml文件中通过DOM4J技术&#xff0c;解析判断add.do对应的是哪个url-pattern&#xff0c;找到后获取对应的servlet-name。在用这个servlet-name去找…