C++智能指针weak_ptr

news/2025/2/16 0:34:36/

文章目录

  • weak_ptr概述
  • weak_ptr常用操作
  • 尺寸问题

weak_ptr概述

  • weak_ptr概述

weak_ptr辅助shared_ptr进行工作,weak_ptr是弱引用的意思(强引用是shared_ptr), weak_ptr同shared_ptr一样都是类模板和智能指针,weak_ptr对资源的引用是非拥有式的,weak_ptr没有资源的管理权限,不能控制资源的释放,它常被用来检查资源.

  • weak_ptr的创建
    弱引用常常用shared_ptr来初始化.
auto p1 = make_shared<int>(100);
weak_ptr<int> p1_r = p1;
// 两个指针共同分享一快资源,强引用计数不变, 若引用计数加1.
//  强引用控制资源的释放, 弱引用对资源生命没有影响

weak_ptr常用操作

  • lock():
    检查weak_ptr指向的对象是否存在, 存在则就返回一个指向该对象的shared_ptr的指针(会让shared_ptr引用计数加1), 不存在就返回一个空的shared_ptr;
auto p1 = make_shared<int>(100);
weak_ptr<int> p1_r = p1;
auto p2 = p1_r.lock(); // p2是一个shared_ptr;
  • use_count()
    获取同享一份资源的弱指针的数量
	auto p1 = make_shared<int>(100);weak_ptr<int> p1_r = p1;cout << p1_r.use_count() << endl; // 打印出1
  • expired()
    弱指针指向的资源不存在(或者use_count为零),则返回true,否则返回false
	auto p1 = make_shared<int>(100);weak_ptr<int> p1_r = p1;p1.reset();if (p1_r.expired()) cout << "对象过期" << endl;else cout << "没有过期" << endl;
  • reset()
    将该弱引用指针设置为空, 弱引用数量减1
	auto p1 = make_shared<int>(100);weak_ptr<int> p1_r = p1;p1_r.reset();if (p1_r.expired()) cout << "对象过期" << endl;else cout << "没有过期" << endl;

尺寸问题

weak_ptr和shared_ptr一样大, 都是裸指针的两倍.

	auto p1 = make_shared<int>(200);weak_ptr<int> p1_r = p1;int* p;cout << sizeof(p) << endl; // 8cout << sizeof(p1) << endl;  // 16cout << sizeof(p1_r) << endl; // 16

在智能指针内部有两个裸指针, 所以是普通裸指针的两倍.
在这里插入图片描述
在这里第一个裸指针指向的是类型的对象,第二个指针指向的是由shared_ptr创建的控制快.两个指针同享一份资源.


http://www.ppmy.cn/news/1009430.html

相关文章

java反射机制原理、获取Class方式和其应用场景

1、反射是什么&#xff1a; 反射是一种动态地获取和操作类信息的行为。类信息包括类的属性、方法、构造函数等。 类信息在Java中通常存储在.class文件中。当我们编写Java代码并进行编译时&#xff0c;编译器&#xff08;javac&#xff09;将源代码转换为字节码&#xff0c;并将…

MongoDB SQL

Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。C:\Users\Administrator>cd C:\MongoDB\Server\3.4\binC:\MongoDB\Server\3.4\bin> C:\MongoDB\Server\3.4\bin> C:\MongoDB\Server\3.4\bin>net start MongoDB 请求的…

第七章:进程间通信(IPC)——构成进程间通信的信道方案

系列文章目录 文章目录 系列文章目录前言进程间通信介绍进程间通信目的进程间通信发展进程间通信分类进程通信的原理 管道什么是管道pipe管道通信特点简单设计 命名管道什么是命名管道mkfifostrcmp/strncasecmpunlinkgetch简单设计 共享内存什么是共享内存shmget/ftokipcsshmct…

程序环境和预处理(含C语言程序的编译+链接)--2

文章前言&#xff1a; 上章我们把 程序的翻译环境 程序的执行环境 C语言程序的编译链接 预定义符号介绍 预处理指令 #define 宏和函数的对比 预处理操作符 #和##的介绍 的相关知识进行了梳理讲解&#xff0c;接下来被把剩余知识 命令定义 …

android studio 实用插件推荐

本文字数&#xff1a;&#xff1a;2352字 预计阅读时间&#xff1a;8分钟 背景 现在做安卓开发的同学基本都是用 Android Studio 了吧&#xff0c;它具有强大的开放性&#xff0c;可以让用户根据自己的需求开发或使用一些插件辅助自己搬砖&#xff0c;当然开发插件我们可能还没…

2023年中小型企业如何选择CRM?

随着科技的不断发展&#xff0c;CRM软件已经成为企业管理的重要工具之一。但是对于中小企业来说&#xff0c;选择一款适合自己企业的CRM软件并不容易。2023年有哪些适合中小企业的crm软件推荐&#xff1f;下面3款crm让企业轻松管理客户&#xff0c;提升企业效率。 1.Zoho CRM …

AWS Amplify 部署node版本18报错修复

Amplify env&#xff1a;Amazon Linux:2 Build Error : Specified Node 18 but GLIBC_2.27 or GLIBC_2.28 not found on build 一、原因 报错原因是因为默认情况下&#xff0c;AWS Amplify 使用 Amazon Linux:2 作为其构建镜像&#xff0c;并自带 GLIBC 2.26。不过&#xff0c;…

2023-08-05 LeetCode每日一题(合并两个有序链表)

2023-08-05每日一题 一、题目编号 21. 合并两个有序链表二、题目链接 点击跳转到题目位置 三、题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例1&#xff1a; 示例2&#xff1a; 示例3&#xff1a; …