memory动态内存管理学习之weak_ptr

news2024/12/23 15:05:36

此头文件是动态内存管理库的一部分。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.coloradmin.cn/o/1877281.html

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

相关文章

快速应用开发(RAD):加速软件开发的关键方法

目录 前言1. 快速应用开发的概念1.1 什么是快速应用开发&#xff1f;1.2 RAD与传统开发方法的对比 2. 快速应用开发的实施步骤2.1 需求分析与规划2.2 快速原型开发2.3 用户评估与反馈2.4 迭代开发与改进2.5 最终交付与维护 3. 快速应用开发的优点与应用场景3.1 优点3.2 应用场景…

24级中国科学技术大学843信号与系统考研分数线,中科大843初复试科目,参考书,大纲,真题,苏医工生医电子信息与通信工程。

(上岸难度&#xff1a;★★★★☆&#xff0c;考试大纲、真题、经验帖等考研资讯和资源加群960507167/博睿泽电子信息通信考研咨询&#xff1a;34342183) 一、专业目录及考情分析 说明: ①复试成绩:满分100分。上机满分50分&#xff0c;面试满分150分&#xff0c;复试成绩(上机…

Llama 3 模型微调的步骤

环境准备 操作系统&#xff1a;Ubuntu 22.04.5 LTS Anaconda3&#xff1a;Miniconda3-latest-Linux-x86_64 GPU&#xff1a; NVIDIA GeForce RTX 4090 24GStep 1. 准备conda环境 创建一个新的conda环境&#xff1a; conda create --name llama_factory python3.11激活刚刚创…

线性代数--行列式1

本篇来自对线性代数第一篇的行列式的一个总结。 主要是行列式中有些关键点和注意事项&#xff0c;便于之后的考研复习使用。 首先&#xff0c;对于普通的二阶和三阶行列式&#xff0c;我们可以直接对其进行拆开&#xff0c;展开。 而对于n阶行列式 其行列式的值等于它的任意…

系统运维面试题总结(网络基础类)

系统运维面试题总结&#xff08;网络基础类&#xff09; 网络基础类第七层&#xff1a;应用层第六层&#xff1a;表示层第五层&#xff1a;会话层第四层&#xff1a;传输层第三层&#xff1a;网络层第二层&#xff1a;数据链路层第一层&#xff1a;物理层 类似面试题1、TCP/IP四…

Django 配置静态文件

1&#xff0c;DebugTrue 调试模式 Test/Test/settings.py DEBUG True...STATICFILES_DIRS [os.path.join(BASE_DIR, static),] STATIC_URL /static/ 1.1 创建静态文件 Test/static/6/images/Sni1.png 1.2 添加视图函数 Test/app6/views.py from django.shortcuts impor…

使用Java实现通用树形结构转换工具类:深入解析TreeUtil和TreeNode接口

文章目录 一、TreeNode接口设计二、TreeUtil工具类设计三、示例&#xff1a;实现TreeNode接口的节点类四、示例&#xff1a;使用TreeUtil构建树形结构五、总结 &#x1f389;欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1…

落石滑坡监测报警系统:创新保障高速公路安全

​ ​​在现代交通建设中&#xff0c;高速公路的安全性和稳定性至关重要。特别是易发生落石区域&#xff0c;如何有效预防和应对落石滑坡带来的事故成为了一项关键性挑战。为此&#xff0c;落石滑坡监测报警系统应运而生&#xff0c;它通过先进的技术手段&#xff0c;为高速…

汇聚荣拼多多运营好吗?

在当前电商行业竞争激烈的背景下&#xff0c;拼多多凭借其独特的商业模式和市场定位迅速崛起&#xff0c;成为众多商家和品牌争相入驻的平台。对于“汇聚荣拼多多运营好吗?”这一问题&#xff0c;答案是肯定的。拼多多不仅提供了一个广阔的市场空间&#xff0c;还通过其创新的…

C++输出彩色方块

1.使用方法 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0xab); ———————————————————————————————————————— 0 黑色 1 蓝色 2 绿色 3 湖蓝色 4 红色 5 紫色 6 黄色 7 白色 8 灰色 9 …

linux下安装kkFileView4

kkFileView为文件文档在线预览解决方案&#xff0c;该项目使用流行的spring boot搭建&#xff0c;易上手和部署&#xff0c;基本支持主流办公文档的在线预览&#xff0c;如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频等等 安装kkFileView前需要安装LibreOffic…

HarmonyOS开发:应用完整性校验

简介 为了确保应用的完整性和来源可靠&#xff0c;OpenHarmony需要对应用进行签名和验签。 应用开发阶段&#xff1a; 开发者完成开发并生成安装包后&#xff0c;需要开发者对安装包进行签名&#xff0c;以证明安装包发布到设备的过程中没有被篡改。OpenHarmony的应用完整性校…

推理之巅 超云为先|2024中国智算中心全栈技术大会,超云引领AI算力新趋势

在AI技术日新月异的浪潮中&#xff0c;算力作为推动数字经济发展的关键力量&#xff0c;正迎来全新的发展机遇。 6月25日至27日&#xff0c;以“AI赋能&#xff0c;重构未来”为主题的2024中国智算中心全栈技术大会、第5届中国数据中心绿色能源大会暨第10届中国&#xff08;上…

在本地和Linux之间传输文件

1.打开本地的cmd窗口 2. 然后按这个链接的说法在cmd中远程连接Linux&#xff08;技术|如何在 Linux 中使用 sFTP 上传或下载文件与文件夹&#xff09; 3. 看这个链接里面的sftp命令进行本地和Linux之间的文件互传 &#xff08;https://www.cnblogs.com/niuben/p/13324099.htm…

【机器学习】阿里Qwen-VL:基于FastAPI私有化部署你的第一个AI多模态大模型

目录 一、引言 二、Qwen-VL 介绍 2.1 Qwen-VL 特点 2.2 Qwen-VL 原理 2.3 Qwen-VL 模型结构 三、FastAPI封装Qwen-VL大模型服务接口 3.1 FastAPI 极简入门 3.1.1 FastAPI 3.1.2 uvicorn 3.1.3 pydantic 3.2 QwenVL-API服务端 3.2.1 代码示例 3.2.2 代码详解 3.…

机器人控制系列教程之关节空间运动控制器搭建(1)

机器人位置控制类型 机器人位置控制分为两种类型&#xff1a; 关节空间运动控制—在这种情况下&#xff0c;机器人的位置输入被指定为一组关节角度或位置的向量&#xff0c;这被称为机器人的关节配置&#xff0c;记作q。控制器跟踪一个参考配置&#xff0c;记作 q r e f q_{re…

WordPress Quiz Maker插件 SQL注入漏洞复现(CVE-2024-6028)

0x01 产品简介 WordPress Quiz Maker插件是一款功能强大的测验生成工具,旨在帮助用户轻松、快速地构建复杂的测验和考试。插件支持多种问题类型,包括单选框(MCQ)、复选框(MCQ)、下拉列表(MCQ)、文本、短文本、数字、日期等。还支持横幅(HTML)显示信息性消息、填空题…

权限维持-域环境单机版---映像劫持(多)

目录 映像位置: 测试&#xff1a;执行 notepad 成 cmd 配合GlobalFlag隐藏-->执行正常关闭后触发 映像位置: 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe 测试&#xff1a;执行 notepad 成 cmd…

数据结构--堆(图文)

在开始学习堆之前&#xff0c;我们要先简单了解二叉树 二叉树 一棵二叉树是结点的一个有限集合&#xff0c;该集合: 为空由一个根结点加上两棵子树&#xff08;左子树和右子树&#xff09; 特殊的二叉树&#xff1a; 满二叉树&#xff1a;一个二叉树&#xff0c;如果每一…