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

news2024/11/23 11:52:49

简介: 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赋值给platformStore
    platformStore = 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.coloradmin.cn/o/1003502.html

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

相关文章

问 ChatGPT 50个问题,耗水 500 毫升;通讯专家发帖称 iPhone 网络国内造假丨RTE开发者日报 Vol.47

开发者朋友们大家好&#xff1a; 这里是「RTE 开发者日报」&#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

mysql在ubuntu上命令行登陆密码不正确

1.登陆提示如下 2.使用mysql -u root -p登录也是类似的 3.打开宝塔面板 点击root密码&#xff0c;更改密码后即可在命令行界面登录 4.登录效果如下

Java从入门到精通-类和对象(二)

0. 类和对象 3. 类的构造方法 构造方法是一种特殊的方法&#xff0c;用于创建和初始化对象。构造方法的名称必须与类名相同&#xff0c;它没有返回值&#xff0c;并且在创建对象时自动调用。构造方法的主要作用是确保对象在创建时具有合适的初始状态。 以下是构造方法的基本概…

掌握这些,让你轻松玩转钡铼PLC网关与西门子S7-1200的MQTT通信

一、软硬件描述 西门子PLC S7-1215钡铼BL102网关mosquitto MQTT服务器&#xff08;腾讯云上搭建&#xff09;可以上网的路由器一套 二、需要使用的软件。 西门子Portal v15.1 (西门子PLC编程软件&#xff09;钡铼BL102调试软件及说明书。 说明书下载链接&#xff1a; http:/…

Map集合案例-统计投票人数

需求&#xff1a; 某个班级80名学生&#xff0c;现在需要组成秋游活动&#xff0c;班长提供了四个景点依次是(A、B、C、D)&#xff0c;每个学生只能选择一个景点&#xff0c;请统计出最终哪个景点想去的人数最多。 利用Map集合进行统计 //A06_HashMapDemo2.java package dail…

【报错】bash: curl: command not found

&#xff08;1&#xff09;报错&#x1f631;&#x1f631;&#x1f631; bash: curl: command not found &#xff08;2&#xff09;分析&#x1f430;&#x1f430;&#x1f430; 安装对应的工具包 curl即可。 &#xff08;3&#xff09;解决方法&#x1f489;&#x1f4…

分库分表知识点

分库分表专题 1.概述 1.1 分库分表是什么 小明是一家初创电商平台的开发人员&#xff0c;他负责卖家模块的功能开发&#xff0c;其中涉及了店铺、商品的相关业务&#xff0c;设计如下数据库&#xff1a; 通过以下SQL能够获取到商品相关的店铺信息、地理区域信息 SELECT p.*…

SQL常用脚本整理(上)

点击关注公众号&#xff0c;SQL干货及时获取 后台回复&#xff1a;1024&#xff0c;获取海量学习资源 SQL刷题专栏 SQL145题系列 大家注意&#xff1a; 因为微信改了推送机制&#xff0c;会有小伙伴刷不到当天的文章&#xff0c; 一些比较实用的知识和信息&#xff0c;错过了就…

若依框架i18n国际化

需求背景 项目需求要做国际化&#xff0c;结果网上找了好几篇文章&#xff0c;没有一个可以一次性搞定&#xff0c;现在这里总结一下。首先&#xff0c;我们分为两部分处理&#xff0c;一个是前端页面的静态文字&#xff0c;这个由前端vue.json自行处理。第二部分就是后端的错…

Windows 11 安装Boost 库

Boost 库下载和安装 Boost 官网地址&#xff1a;https://www.boost.org/ ,首先进入官网下载对应版本的 Boost 库文件。点击下图所示绿框中的 Download 进入下载页面。 进入下载页面&#xff0c;下载所需要的版本&#xff0c;我现在下载的版本为1.83.0&#xff0c;下载的是win…

IGBT和碳化硅SiC模块,全球市场总体规模,前二十大厂商排名及市场份额

IGBT模块与碳化硅SiC模块全球市场总体规模 2023年全球IGBT模块市场规模大约为67亿美元&#xff0c;预计2029年将达到145亿美元&#xff0c;未来几年年复合增长率CAGR为13.6%。 2023年全球碳化硅SiC模块市场规模大约为16.9亿美元&#xff0c;预计2029年将达到92亿美元&#xff…

MySQL内连接和外连接及七种SQL JOINS的实现

1. 内连接 2.外连接左外连接&#xff1a;右外连接&#xff1a;满外连接&#xff1a; 3. SQL99语法实现多表查询 3.1 SQL99实现内连接 3.2 SQL99语法实现外连接 3.2.1 左外连接3.2.2 右外连接 3.2.3 满外连接 4.总结&#xff1a;七种SQL JOINS的实现 4.1 内连接 4.2 左…

【开发者工具中$0的作用】

在开发者工具中每当我们选中元素的时候 最右侧都会出现一个 $0 不知道大家有没有注意到 以下图为例 我选中最新排序的input框 输入$0 它就默认选中这个元素 我们可以在这里进行一些赋值等操作

OpenHarmony社区运营报告(2023年8月)

本月快讯 2023年8月3日&#xff0c;OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;发布了Beta2版本。OpenHarmony 4.0 Beta2在系统能力、应用框架、分布式通信、媒体功能、安全性等方面进行了全面升级。其中&#xff0c;ArkUI增强了界面组件能力&#x…

Linux基础命令(示例代码 + 解释)

查看目录下文件 ls [-a -l -h] [路径] -a&#xff08;全部&#xff09; -l&#xff08;细节&#xff09; -h&#xff08;大小&#xff09; ls ls / ls -a ls -l ls -h ls -alh ls -l -h -a ls -lah /切换目录 cd [路径] change di…

kafka增加磁盘或者分区,topic重分区

场景&#xff1a;kafka配置文件log.dirs增加了几个目录&#xff0c;但是新目录没有分区数据写入&#xff0c;所以打算进行重分区一下。 1.生成迁移计划 进入kafka/bin目录 新建 topic-reassign.json,把要重分区的topic按下面格式写。 { "topics": [{ …

NotionAI使用指南

一、NotionAI是什么 NotionAI是一款基于人工智能技术的知识管理工具&#xff0c;具有以下功能&#xff1a; 智能提醒: NotionAI可以根据用户的使用习惯和工作流程&#xff0c;智能提醒用户需要完成的任务和事项&#xff0c;帮助用户更好地规划和安排工作时间。智能分类: Noti…

洗鞋软件开发,洗鞋店小程序功能介绍;

洗鞋小程序开发搭建&#xff1b; 作为一个技术出身的设计人&#xff0c;今天我想跟大家一起来聊一聊目前市面上的洗鞋小程序&#xff0c;截止目前&#xff0c;我们闪站侠洗护软件已经累计服务用户2000 可以总结一下&#xff0c;目前市面上只要是宣称自己做互联网洗鞋的&#x…

MyBatis的使用

一.在创建Spring项目时引入MyBatis Framework和MySQL Driver; 二.下载插件&#xff1a;MyBatisX插件。 三.配置文件&#xff1a; 四.根据MyBatis写法完成数据库的操作 常规写法&#xff0c;包括两个文件&#xff1a; 1.接口&#xff1a;方法的声明&#xff08;给其他层调用&…

CAN/CANFD转WIFI设备解决近距离无线通讯问题

在现场应用中&#xff0c;各种情况都会出现&#xff0c;一些运动设备进行维护、下载、测试工作时&#xff0c;需要近距离无线收发CAN/CANFD报文。 港口应用中&#xff0c;控制室与吊机一没有办法通过有线连接&#xff0c;这时候就可以用无线来实现数据抓取。 例如某AGV小车厂…