memory动态内存管理学习之weak_ptr

此头文件是动态内存管理库的一部分。std::weak_ptr 是一种智能指针,它持有对被 std::shared_ptr 管理的对象的非拥有性(“弱”)引用。在访问所引用的对象前必须先转换为 std::shared_ptr。std::weak_ptr 用来表达临时所有权的概念:当某个对象只有存在时才需要被访问,而且随时可能被他人删除时,可以使用 std::weak_ptr 来跟踪该对象。需要获得临时所有权时,则将其转换为 std::shared_ptr,此时如果原来的 std::shared_ptr 被销毁,则该对象的生命期将被延长至这个临时的 std::shared_ptr 同样被销毁为止。std::weak_ptr 的另一用法是打断 std::shared_ptr 所管理的对象组成的环状引用。若这种环被孤立(例如无指向环中的外部共享指针),则 shared_ptr 引用计数无法抵达零,而内存被泄露。可通过令环中的指针之一为弱指针来避免这种情况。

成员函数

(构造函数)

构造新的 weak_ptr
(公开成员函数)

(析构函数)

销毁 weak_ptr
(公开成员函数)

operator=

weak_ptr 赋值
(公开成员函数)
修改器

reset

释放被管理对象的所有权
(公开成员函数)

swap

交换被管理对象
(公开成员函数)
观察器

use_count

返回管理该对象的 shared_ptr 对象数量
(公开成员函数)

expired

检查被引用的对象是否已删除
(公开成员函数)

lock

创建管理被引用的对象的 shared_ptr
(公开成员函数)

owner_before

提供弱指针的基于拥有者的排序
(公开成员函数)

示例代码:

#include <iostream>
#include <memory>

struct C3 { int* data; };

int main()
{
	// weak_ptr constructor example
	std::shared_ptr<int> sp(new int);

	std::weak_ptr<int> wp0;
	std::weak_ptr<int> wp1(wp0);
	std::weak_ptr<int> wp2(sp);
	// weak_ptr use_count example
	std::cout << "use_count:\n";
	std::cout << "wp0: " << wp0.use_count() << '\t';
	std::cout << "wp1: " << wp1.use_count() << '\t';
	std::cout << "wp2: " << wp2.use_count() << '\n';

	// weak_ptr::operator= example
	std::shared_ptr<int> sp1, sp2;
	std::weak_ptr<int> wp;
	// sharing group:
	// --------------
	sp1 = std::make_shared<int>(10);		// sp1
	wp = sp1;								// sp1, wp
	sp2 = wp.lock();						// sp1, wp, sp2
	sp1.reset();							// wp, sp2
	sp1 = wp.lock();						// sp1, wp, sp2
	std::cout << "*sp1: " << *sp1 << '\t';
	std::cout << "*sp2: " << *sp2 << '\n';

	// weak_ptr::reset example
	std::shared_ptr<int> sp3(new int(10));
	std::weak_ptr<int> wp3(sp3);
	std::cout << "1. wp3 " << (wp3.expired() ? "is" : "is not") << " expired\n";
	wp3.reset();
	std::cout << "2. wp3 " << (wp3.expired() ? "is" : "is not") << " expired\n";

	// weak_ptr::swap example
	std::shared_ptr<int> sp4(new int(10));
	std::shared_ptr<int> sp5(new int(20));

	std::weak_ptr<int> wp4(sp4);
	std::weak_ptr<int> wp5(sp5);
	wp4.swap(wp5);
	std::cout << "sp4 -> " << *sp4 << '\t';
	std::cout << "sp5 -> " << *sp5 << '\n';
	std::cout << "wp4 -> " << *wp4.lock() << '\t';
	std::cout << "wp5 -> " << *wp5.lock() << '\n';

	// weak_ptr::expired example
	std::shared_ptr<int> shared(new int(10));
	std::weak_ptr<int> weak(shared);
	std::cout << "1. weak " << (weak.expired() ? "is" : "is not") << " expired\n";
	shared.reset();
	std::cout << "2. weak " << (weak.expired() ? "is" : "is not") << " expired\n";

	// weak_ptr::lock example
	std::shared_ptr<int> sp6, sp7;
	std::weak_ptr<int> wp6;
	// sharing group:
	// --------------
	sp6 = std::make_shared<int>(20);     // sp6
	wp6 = sp6;                            // sp6, wp6
	sp7 = wp6.lock();                     // sp6, wp6, sp7
	sp6.reset();                         //      wp6, sp7
	sp6 = wp6.lock();                     // sp6, wp6, sp7
	std::cout << "*sp6: " << *sp6 << '\n';
	std::cout << "*sp7: " << *sp7 << '\n';

	// weak_ptr::owner_before
	int *p8 = new int(10);
	std::shared_ptr<int> a(new int(20));
	std::shared_ptr<int> b(a, p8);  // alias constructor
	std::weak_ptr<int> c(b);
	std::cout << "comparing a and c...\n" << std::boolalpha;
	std::cout << "value-based: " << (!(a < c.lock()) && !(c.lock() < a)) << '\n';
	std::cout << "owner-based: " << (!a.owner_before(c) && !c.owner_before(a)) << '\n';

	delete p8;
    return 0;
}

运行效果:

参考:

https://cplusplus.com/reference/memory/weak_ptr/

std::weak_ptr - cppreference.com

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣SQL50 判断三角形 case when then end

Problem: 610. 判断三角形 Code select x,y,z,case when x y > z and x z > y and y z > x then Yeselse Noend as triangle from triangle;

Linux shell编程学习笔记59: ps 获取系统进程信息,类似于Windows系统中的tasklist 命令

0 前言 系统进程信息是电脑网络信息安全检查中的一块重要内容&#xff0c;对于使用Linux和基于Linux作为操作系统的电脑来说&#xff0c;可以使用ps命令。 1 ps命令 的功能、格式和选项说明 1.1 ps命令 的功能 Linux 中的ps&#xff08;意为&#xff1a;process status&…

<电力行业> - 《第8课:输电(一)》

1 输电环节的意义 电能的传输&#xff0c;是电力系统整体功能的重要组成环节。发电厂与电力负荷中心通常都位于不同地区。在水力、煤炭等一次能源资源条件适宜的地点建立发电厂&#xff0c;通过输电可以将电能输送到远离发电厂的负荷中心&#xff0c;使电能的开发和利用超越地…

firewalld(2)安装、配置文件、规则查询

安装firewalld 我使用的操作系统是debian 12,并没有安装firewalld。 通过apt install firewalld安装firewalld firewalld 本身是一个服务(firewalld.service),可以通过 systemctl 进行启动、停止和重启,而iptables 本身并不是一个服务,而是一个用户空间工具,被用来配置底…

使用SpringBoot整合Listener

常用的Web事件的监听接口如下&#xff1a; ServletContextListener&#xff1a;用于监听Web的启动及关闭 ServletContextAttributeListener&#xff1a;用于监听ServletContext范围内属性的改变 ServletRequestListener&#xff1a;用于监听用户请求 ServletRequestAttributeLi…

Rocketmq-集群部署(Master-Slave)

使用中间件版本:rocketmq-4.5.2环境介绍及角色划分 这里采用俩台机器做集群的搭建&#xff0c;172.0.0.1 以及 172.0.0.2 服务器172.0.0.1 做为a-master与b-slave。 服务器172.0.0.2 做为b-master与a-slave。 配置讲解图(主要说明区分点) 配置rocketmq环境变量&#xff0c;这里…

steam社区加载异常、加载失败、无法加载、黑屏的解决方法

随着steam夏季特卖的临近&#xff0c;最近几天开启史低折扣的大作已经越来越少了&#xff0c;不过也并不是没有。最经典的知名大作文明6之前已经打到1折的骨折价了&#xff0c;没想到也能背刺&#xff0c;现在是新史低价0.5折11元&#xff0c;很多玩家入手后纷纷前往社区看新手…

spring mvc实现自定义验证器Validator

使用场景 在接口开发的日常实践中&#xff0c;确保数据准确性是保障业务稳定性的关键一环。面对诸如登录时验证用户名密码非空、创建用户时检查邮箱和手机号格式的正确性等需求&#xff0c;手动编写校验逻辑不仅耗时费力&#xff0c;还会显著降低代码的可读性和维护性。鉴于网…

搭建大型分布式服务(四十三)SpringBoot 无代码侵入实现多Kafka数据源发布到Maven中央仓库:让世界看到你的作品!

系列文章目录 文章目录 系列文章目录前言一、大概步骤二、完整教程三、参考文章 前言 在软件开发的世界里&#xff0c;分享和协作是推动技术进步的重要力量。当你开发了一个优秀的SpringBoot插件&#xff0c;并希望将其分享给全世界的开发者使用时&#xff0c;将插件发布到Mav…

在IDEA中创建Maven项目

2023版IDEA创建Maven项目&#xff08;新版&#xff09; 1.打开IDEA&#xff0c;点击 文件 -> 新建 -> 项目 2.创建Maven项目 3.编写java文件并运行 在src -> java -> 创建一个java文件并运行 如果出现下图 解决办法&#xff1a; 2022版IDEA创建Maven项目&#xf…

Leetcode[反转链表]

LCR 024. 反转链表 给定单链表的头节点 head &#xff0c;请反转链表&#xff0c;并返回反转后的链表的头节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示…

JVM专题八:JVM如何判断可回收对象

在JVM专题七&#xff1a;JVM垃圾回收机制中提到JVM的垃圾回收机制是一个自动化的后台进程&#xff0c;它通过周期性地检查和回收不可达的对象&#xff08;垃圾&#xff09;&#xff0c;帮助管理内存资源&#xff0c;确保应用程序的高效运行。今天就让我们来看看JVM到底是怎么定…

基于QT开发的气体成分检测数据记录软件

1、软件概述 气体成分检测数据记录软件用于实现多种气体分析仪及相关设备实时数据的获取、存储和传送。目前支持的设备主要有气体分析仪、多通道进样阀箱、冷阱处理系统和气体采样处理系统。   气体成分检测数据记录软件可以根据实际应用需要进行配置&#xff0c;以实现不同应…

制造企业用AI可以做什么?

ChatGPT横空出世&#xff0c;有关AI的浪潮席卷全球&#xff0c;比起人工智能如何改变世界&#xff0c;可能你更感兴趣我能用AI可以做的事情是什么&#xff1f; 制造企业用AI可以做的事情是什么?人工智能在制造企业中可以做很多事情&#xff0c;以下是一些主要的应用&#xff1…

【Nginx】源码安装

nginx官网&#xff1a;nginx: download 选择文档版本安装即可 1.安装依赖包 //一键安装上面四个依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 2.下载并解压安装包 //创建一个文件夹 cd /usr/local mkdir nginx cd nginx //将下载的nginx压缩…

Linux(Ubuntu20.04)系统中安装deb软件包错误(依赖关系问题-仍未被配置)解决的办法

在Ubuntu16.04下采用如下dpkg命令安装deb软件安装包时&#xff1a; sudo dpkg -i XXXX.deb 发生安装失败&#xff0c;返回信息为&#xff02;正处理时有错误发生&#xff02;&#xff0c;并且在安装过程中出现&#xff02;依赖关系问题-仍未被配置&#xff02;的提示&#xff0…

240629_昇思学习打卡-Day11-Vision Transformer中的self-Attention

240629_昇思学习打卡-Day11-Transformer中的self-Attention 根据昇思课程顺序来看呢&#xff0c;今儿应该看Vision Transformer图像分类这里了&#xff0c;但是大概看了一下官方api&#xff0c;发现我还是太笨了&#xff0c;看不太明白。正巧昨天学SSD的时候不是参考了太阳花的…

编程开发不能不懂的世界协调时UTC的由来

在各种时间标准出现之前&#xff0c;各地都是根据太阳来进行计时的。把太阳连续2次经过地球同一位置所经历的时间间隔称为真太阳日&#xff0c;然后再把这个太阳日划分为更小的时间单位&#xff0c;例如中国古代使用日晷记录时间&#xff0c;把一个太阳日分为12个时辰。因为地球…

海康+libtorch的血泪教训

一、LibTorch使用&#xff0c; 详见&#xff1a; /INCLUDE:?warp_sizecudaatYAHXZ 二、海康二次开发&#xff0c; 目前选4.31&#xff0c;只能c14。 三、做dll注意&#xff1a;

【MongoDB】分布式数据库入门级学习

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;为祖国的科技进步添砖Java 个性签名&#xff1a;保留赤子之心也许是种幸运吧 本文封面由 凯楠&#x1f4f8;友情提供 凯楠&#x1f4f8; - 不夜长安 目录 MongoDB 相关 数据库排行榜单 MongoDB 中文官网 菜鸟…