智能指针三剑客:weak_ptr

2024-05-06 12:28
文章标签 指针 智能 三剑客 weak ptr

本文主要是介绍智能指针三剑客:weak_ptr,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

weak_ptr概述

 weak_ptr对象

weak_ptr简单操作


weak_ptr概述

weak_ptr并不是独立的智能指针,weak_ptr主要被用来辅助share_ptr工作。由于weak_ptr的引用计数并不与指向对象的生命周期相关联,weak_ptr可以安全的访问一个由shared_ptr所管理的对象并不改变指向对象的内容。所以使用weak_ptr访问对象不需要担心意外延长其生命周期。除此之外,weak_ptr一般还被用于解决shared_ptr产生的循环问题。

 weak_ptr对象

weak_ptr的生存依赖于shared_ptr,我们可以使用shared_ptr对象初始化weak_ptr对象,也可以用weak_ptr对象给weak_ptr对象初始化。

shared_ptr<int> ps=weak_ptr<int>(666);
weak_ptr<int> pw(ps);
weak_ptr<int> pw2=pw;

weak_ptr 的创建会引起弱引用计数的增加。与shared_ptr指向产生的强引用计数不同,弱引用计数的增加并不会影响管理对象的生命周期。在调试时,shared_ptr对象和weak_ptr对象都可以用来观察强引用和弱引用的计数。

weak_ptr对象并不管理指向内存的生命周期会造成weak_ptr对象有可能指向一片已经被释放了的内存空间。因此weak_ptr对象并不能直接的访问指向的对象,而是通过使用lock()函数间接访问以确保其安全性。lock的功能是检查weak_ptr指向的对象是否存在,若存在返回指向该对象的shared_ptr指针。若对象已经被释放,返回空的shared_ptr对象。

shared_ptr<int> ps=make_shared<int>(666);
weak_ptr<int> pw(ps);
shared_ptr<int> ps2=pw.lock();
if(pw2==nullptr)
{cout<<"delete over"<<endl;
}
else
{cout<<"strong live"<<endl;
}

weak_ptr简单操作

use_count():返回与该weak_ptr对象指向相同的强指针数量,也就是shared_ptr的引用计数。

shared_ptr<int> ps(new int(666));
auto ps2(ps);
weak_ptr<int> pw(ps);
cout<<pw.use_count()<<endl;//2

expired():检查指向对象是否过期,如果指向对象内存已经被释放了,返回true,否则返回false。

shared_ptr<int> ps(new int(999));
weak_ptr<int> pw(ps);
ps.reset();
if(pw.expired())
{cout<<"指向对象已经过期"<<endl;
}

reset():weak_ptr对象也有reset功能。将该weak_ptr对象置空,强引用计数不变,弱引用计数减一。

shared_ptr<int> ps(new int(666));
weak_ptr<int> pw(ps);
pw.reset();

这篇关于智能指针三剑客:weak_ptr的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/964344

相关文章

使用Python实现表格字段智能去重

《使用Python实现表格字段智能去重》在数据分析和处理过程中,数据清洗是一个至关重要的步骤,其中字段去重是一个常见且关键的任务,下面我们看看如何使用Python进行表格字段智能去重吧... 目录一、引言二、数据重复问题的常见场景与影响三、python在数据清洗中的优势四、基于Python的表格字段智能去重

Spring AI集成DeepSeek三步搞定Java智能应用的详细过程

《SpringAI集成DeepSeek三步搞定Java智能应用的详细过程》本文介绍了如何使用SpringAI集成DeepSeek,一个国内顶尖的多模态大模型,SpringAI提供了一套统一的接口,简... 目录DeepSeek 介绍Spring AI 是什么?Spring AI 的主要功能包括1、环境准备2

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

Python3脚本实现Excel与TXT的智能转换

《Python3脚本实现Excel与TXT的智能转换》在数据处理的日常工作中,我们经常需要将Excel中的结构化数据转换为其他格式,本文将使用Python3实现Excel与TXT的智能转换,需要的可以... 目录场景应用:为什么需要这种转换技术解析:代码实现详解核心代码展示改进点说明实战演练:从Excel到

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

智能交通(二)——Spinger特刊推荐

特刊征稿 01  期刊名称: Autonomous Intelligent Systems  特刊名称: Understanding the Policy Shift  with the Digital Twins in Smart  Transportation and Mobility 截止时间: 开放提交:2024年1月20日 提交截止日

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个