C++之weak_ptr与shared_ptr智能指针实例(一百九十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:C++之weak_ptr与shared_ptr强弱智能指针用法

在C++中,weak_ptr和shared_ptr是智能指针的两种类型,用于解决资源管理和避免内存泄漏的问题。

  1. shared_ptr(共享指针):

    • shared_ptr允许多个智能指针共享同一个对象的所有权。
    • 每个shared_ptr都维护一个引用计数,它记录有多少个shared_ptr指向同一对象。
    • 只有当引用计数变为0时,shared_ptr才会自动析构并释放资源。
    • 可以通过std::make_shared或std::shared_ptr构造函数来创建shared_ptr对象。
  2. weak_ptr(弱指针):

    • weak_ptr是一种不控制对象生命周期的智能指针,它指向一个由shared_ptr管理的对象。
    • weak_ptr可以观测shared_ptr的生命周期,但不会增加引用计数。
    • 使用lock()函数可以获取一个有效的shared_ptr对象来访问观测的资源。
    • 如果shared_ptr已经释放了资源,则lock()函数会返回一个空的shared_ptr。

使用shared_ptr的好处:

  • 避免内存泄漏:通过引用计数,当没有shared_ptr指向对象时,会自动进行资源释放。
  • 安全共享对象:多个shared_ptr可以共享访问同一个对象,不会出现多次释放同一资源的问题。

使用weak_ptr的好处:

  • 避免循环引用:当对象之间存在互相引用而没有外部引用时,使用weak_ptr作为其中一个引用可以打破循环引用,避免内存泄漏。
  • 安全观测资源:通过lock()函数,可以安全地观测shared_ptr所管理的对象,避免悬空指针的问题。

需要注意的是,当使用weak_ptr时,需要注意判断返回的shared_ptr是否为空,以处理shared_ptr已释放资源的情况。另外,weak_ptr并不拥有指向的资源,因此不能直接通过weak_ptr访问资源的成员函数或成员变量,需要使用lock()函数获取shared_ptr对象后才能进行访问。

在C++中,std::weak_ptr类提供了一个成员函数lock(),用于获取与其关联的std::shared_ptr对象。

lock()函数的实现如下:

template<class T>
std::shared_ptr<T> std::weak_ptr<T>::lock() const noexcept;

lock()函数的作用是尝试获取与std::weak_ptr对象关联的std::shared_ptr对象。如果关联的std::shared_ptr对象仍然存在,lock()函数会返回一个有效的、指向相同目标的std::shared_ptr对象。如果关联的std::shared_ptr已被销毁,lock()函数将返回一个空指针(nullptr)。

lock()函数是线程安全的,并且在多线程环境中可以正确地处理std::shared_ptr的引用计数和资源管理。

使用lock()函数可以安全地访问由std::weak_ptr进行观测的对象,避免了悬空指针的风险,同时也不会增加引用计数。

2.应用实例

#include <iostream>
#include <memory>
#include <string>using namespace std;class C2ComponentStore {
public:C2ComponentStore() {}~C2ComponentStore() {}string name = "123456789";
};int main() {//1.创建一个weak_ptr对象platformStore,初始为空std::weak_ptr<C2ComponentStore> platformStore;//2.通过lock()函数获取platformStore的shared_ptr对象std::shared_ptr<C2ComponentStore> store = platformStore.lock();//3.如果获取的shared_ptr对象为空if(store == nullptr) {//4.创建一个新的shared_ptr对象store,并使用make_shared初始化store = std::make_shared<C2ComponentStore>();//5.将store赋值给platformStoreplatformStore = store;}printf("store.name = %s\n",store->name.c_str());printf("platformStore.name = %s\n",platformStore.lock()->name.c_str());return 0;
}

以上代码中,platformStore.lock()的调用将尝试获取与platformStore关联的std::shared_ptr对象。如果对象仍然有效,那么返回的std::shared_ptr对象是有效的,可以使用它来访问对象的成员变量和方法。如果对象已被销毁,那么返回的std::shared_ptr对象将是一个空指针。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美陆军推动人工智能算法的持续更新

源自&#xff1a;蓝德智库 声明:公众号转载的文章及图片出于非商业性的教育和科研目的供大家参考和探讨&#xff0c;并不意味着支持其观点或证实其内容的真实性。版权归原作者所有&#xff0c;如转载稿涉及版权等问题&#xff0c;请立即联系我们删除。 “人工智能技术与咨询”…

C++(day5)

思维导图 小练习 实现一个图形类&#xff08;Shape&#xff09;&#xff0c;包含受保护成员属性&#xff1a;周长、面积&#xff0c;公共成员函数&#xff1a;特殊成员函数书写 定义一个圆形类&#xff08;Circle&#xff09;&#xff0c;继承自图形类&#xff0c;包含私有属性…

攻防世界-WEB-easyupload

1.新建.user.ini文件&#xff0c;内容如下 GIF89a auto_prepend_filea.jpg 2.上传该文件&#xff0c;并用burp抓包&#xff0c;将Content-Type: application/octet-stream修改为 Content-Type: image/jpg 3.放包&#xff0c;结果如下 4. 新建a.txt文件&#xff0c;内容为 GIF89…

窗口函数-分组排序:row_number()、rank() 、dense_rank()、ntile()

窗口函数语法结构&#xff1a; 分析函数() over(partition by 分组列名 order by 排序列名 rows between 开始位置 and 结束位置) 开窗函数和聚合函数区别&#xff1a; 聚合函数会对一组值进行计算并返回一个值&#xff0c;常见的比如sum()&#xff0c;count()&#xff0c;ma…

Autojs 小游戏实践-潮玩宇宙开扭蛋

概述 最近在玩潮流宇宙&#xff0c;里面有扭蛋兔的一个玩法&#xff0c;开始有很多蛋&#xff0c;需要我们一个个点开&#xff0c;然后根据装备品质替换分解&#xff0c;潮流提供了自动开扭蛋功能&#xff0c;但是开到品质比自己装备好的时候回暂停&#xff0c;由于个人懒得看…

Java密码学之数字签名

密码系统是加密技术及其附带基础工具的实现&#xff0c;以提供信息安全服务。基本密码系统的各种组件是明文&#xff0c;加密算法&#xff0c;密文&#xff0c;解密算法&#xff0c;加密密钥和解密密钥。其中加密密钥和解密密钥是&#xff1a; 加密密钥是发件人已知的值。发送…

《向量数据库指南》——向量数据库内核面临的技术挑战及应对措施

最近一年&#xff0c;以 ChatGPT、LLaMA 为代表的大语言模型的兴起&#xff0c;将向量数据库的发展推向了新的高度。 向量数据库是一种在机器学习和人工智能领域日益流行的新型数据库&#xff0c;它能够帮助支持基于神经网络而不是关键字的新型搜索引擎。向量数据库不同于传统的…

CMake+CLion+Qt配置

在这里我下载MSVC的工具包&#xff0c;并没有下载Visual Studio。 配置编译环境 下载Visual Studio&#xff0c;其中有MSVC编译工具&#xff0c;下载MSVC工具包&#xff0c; 工具包下载链接&#xff1a;https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/ …

第5篇 vue的通信框架axios和ui框架-element-ui以及node.js

一 axios的使用 1.1 介绍以及作用 axios是独立于vue的一个项目&#xff0c;基于promise用于浏览器和node.js的http客户端。 在浏览器中可以帮助我们完成 ajax请求的发送在node.js中可以向远程接口发送请求 1.2 案例使用axios实现前后端数据交互 1.后端代码 2.前端代码 &…

Linux 下 C语言版本的线程池

目录 1. 线程池引入 2. 线程池介绍 3. 线程池的组成 4. 任务队列 5. 线程池定义 6. 头文件声明 7. 函数实现 8. 测试代码 1. 线程池引入 我们使用线程的时候就去创建一个线程&#xff0c;这样实现起来非常简便&#xff0c;但是就会有一个问题&#xff1a;如果并发的线程数…

循环购模式:一种新型的电商模式,让你的生意更轻松

你是否想过&#xff0c;你的商品能够以一种更高效、更环保、更有趣的方式销售给顾客&#xff1f;你是否想过&#xff0c;你的顾客能够以一种更低成本、更高回报、更多互动的方式享受你的商品&#xff1f;如果你的答案是肯定的&#xff0c;那么你一定要了解一下循环购模式。 循环…

IDEA的快捷键大全

快捷键 说明 IntelliJ IDEA 的便捷操作性&#xff0c;快捷键的功劳占了一大半&#xff0c;对于各个快捷键组合请认真对待。IntelliJ IDEA 本身的设计思维是提倡键盘优先于鼠标的&#xff0c;所以各种快捷键组合层出不穷&#xff0c;对于快捷键设置也有各种支持&#xff0c;对…