C++之std::enable_shared_from_this实例(一百九十八)

news2025/1/6 19:24:47

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

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

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

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

欢迎关注Android系统攻城狮

1.前言

本篇目的:C++之std::enable_shared_from_this实例

std::enable_shared_from_this 是一个模板类,在 C++ 标准库的 <memory> 头文件中定义。它提供了一种方便的方式来在类中获取指向自身的 std::shared_ptr

std::enable_shared_from_this 主要用于解决在一个对象需要将自身的所有权共享给多个 std::shared_ptr 的情况。它的作用可以总结如下:

  1. 获取共享指针:通过继承 std::enable_shared_from_this,可以在类内部使用 shared_from_this() 成员函数来获取指向当前对象的 std::shared_ptr

  2. 避免裸指针问题:使用 std::enable_shared_from_this 可以解决裸指针(raw pointer)转换为 std::shared_ptr 的问题。如果一个对象直接从裸指针创建而不是通过 std::shared_ptr,那么调用 shared_from_this() 将导致 undefined behavior。而继承 std::enable_shared_from_this 可以确保对象只能通过 std::shared_ptr 创建,并且可以正确地共享所有权。

  3. 安全地共享所有权:当多个 std::shared_ptr 指向同一对象时,它们共享对该对象的所有权。这种方式可以确保在所有 std::shared_ptr 都析构之后,对象才会被正确地销毁。如果不通过 std::enable_shared_from_this 使用 shared_from_this(),在获取指向自身的 std::shared_ptr 时可能会导致引用计数错误或对象的早期销毁。

请注意,为了正确使用 std::enable_shared_from_this,必须遵循以下几点:

  • 类必须继承自 std::enable_shared_from_this
  • 对象的生命周期必须由 std::shared_ptr 管理,不能使用裸指针。
  • 获取 shared_from_this() 的调用必须发生在对象被 std::shared_ptr 管理之后。

std::enable_shared_from_this 提供了一种安全和方便的方式来获取指向自身的 std::shared_ptr,有效地解决了共享所有权的问题。

2.实例

#include <iostream>
#include <memory>

class Test : public std::enable_shared_from_this<Test> {
public:
  std::shared_ptr<Test> getShared() {
    return shared_from_this();
  }
};

int main() {
  std::shared_ptr<Test> objPtr = std::make_shared<Test>();
  std::shared_ptr<Test> sharedPtr = objPtr->getShared();

  //使用objPtr.get()和sharedPtr.get()来获取指针的原始地址.
  printf("objPtr = %p, sharedPtr = %p\n",objPtr.get(),sharedPtr.get());
  if(objPtr == sharedPtr){
    printf("objPtr == objPtr \n");
  }

  return 0;
}

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

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

相关文章

如何利用在线考试系统优化答题过程

随着技术的不断进步&#xff0c;越来越多的考试机构和教育机构开始采用在线考试系统进行评估和测验。使用在线考试系统可以极大地提升答题的效率和准确性。 准备阶段 在开始答题前&#xff0c;有一些准备工作可以帮助优化答题过程。 要仔细阅读考试要求和题目说明。这些说明…

JS中应该注意的点

本帖子记录在使用前端时遇到的一些小点。 1.html()和text()和val()的使用及区别 1.1 val() val&#xff08;&#xff09;是对于单标签元素的值&#xff0c;其中一个很重要的特性是value"" Value:<input id"input" type"text" value"LO…

postman导入json脚本文件(Collection v1.0、Collection v2.0)

1. 以postman v8.5.1 版本为例 2. 在postman v5.0.2 低版本中导出json脚本文件, 请选择Collection v2.0 Export - Collection v2 3. 在postman v8.5.1 版本 导入 json脚本文件 Import - Collection v2 - Export - Import

ROS rviz常用可视化插件

文章目录 ROS rviz常用可视化插件rviz常用可视化组件GridMapLaser ScanPointCloud2TFImagesPathMarker ROS rviz常用可视化插件 rviz RViz&#xff08;Robot Visualization&#xff09;是ROS&#xff08;Robot Operating System&#xff09;中的一个重要工具&#xff0c;用于…

常见的网络欺诈风险类型有哪些?

身份伪冒&#xff0c;这是非常典型的第三方欺诈&#xff0c;指的是不法分子使用虚假身份证等身份信息、未经他人同意而冒用他人身份获取贷款的骗贷行为。 另外还有帐号垃圾注册&#xff0c;通过大规模的帐号注册&#xff0c;养号养卡&#xff0c;控制帐号骗贷。此外还有中介包装…

原型链解释

一、什么是原型链 原型链是javascript中用来实现类似类继承的一套机制。像链条一样把javascript中的对象连接起来&#xff0c;实现类似子联系父的现象。 二、原型链的实现 总的来说&#xff0c;就是&#xff1a; 对象的__proto__指向其构造器的prototype对象&#xff0c;然后…

上半年实现营收9.24亿元,创新奇智的AI成制造业福星?

如今&#xff0c;AI大模型迈入了商业化落地的新阶段&#xff0c;并且已经有不少产品被不知不觉地应用到了生活各个方面。 其中&#xff0c;作为AI领域的后起之秀&#xff0c;创新奇智也于近日发布了截至2023年6月30日止六个月的中期业绩报告。数据显示&#xff0c;创新奇智202…

新建的SFTP用户,连接报错

useradd -m -d /usr/local/data/ftp/abc abc 新建SFTP用户 usermod -g sftpgroup -G sftpgroup abc 将abc加入到sftpgroup组 Received disconnect from 192.168.10.2 port 22:2: Too many authentication failures Disconnected from 192.168.10.2 port 22 Connection clos…

6、DVWA——SQL injection

文章目录 一、概述二、low2.1 通关思路&#xff08;1&#xff09;判断是否存在sql注入漏洞。&#xff08;2&#xff09;判断字符型还是数字型&#xff08;3&#xff09;判断字段数&#xff08;4&#xff09;查看回显点&#xff08;5&#xff09;查看数据库名&#xff08;6&…

R730xd风扇调速

共使用了三个方法都是有效的&#xff0c;dell_fans_controller_v1.0.0和Dell_EMC_Fans_Controller_1.0.1以及ipmitool&#xff0c;前面两个是GUI界面后面一个是命令行工具 重点 我虽然能通过设置的ip地址能访问idrac管理界面&#xff0c;但是使用上面三个工具都是无法获取风扇…

C++:模板(函数模板、类模板)

本文主要介绍泛型编程、函数模板和类模板。 目录 一、泛型编程 二、函数模板 1.函数模板概念 2.函数模板格式 3.函数模板的原理 4.函数模板的实例化 5.模板参数的匹配原则 三、类模板 1.类模板的定义格式 2.类模板的实例化 一、泛型编程 如何实现一个通用的交换函数…

普通的maven里面没有配置tomcat服务器问题

上面的意思也就是可以直接如下访问 他会直接给我们跳转到 webapp下面的index.jsp页面 为什么跳转到这个页面呢&#xff0c;原因在于我们在tomcat服务器里面的配置文件web.xml做了如下配置 只要webapp下面有如上几个页面&#xff0c;就会被默认运行 如果运行中出现控制台中文…

2023年8月京东彩瞳行业数据分析(京东商品数据)

和传统的框架眼镜、隐形眼镜相比&#xff0c;多种花纹、颜色的美瞳镜片给了爱美的年轻人更多的选择&#xff0c;因此&#xff0c;在颜值经济叠加悦己思潮的影响下&#xff0c;兼具“视力矫正美妆”的彩瞳受追捧。 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;8月份&…

TorchAudio has CUDA version 11.7.

RuntimeError: Detected that PyTorch and TorchAudio were compiled with different CUDA versions. PyTorch has CUDA version 11.8 whereas TorchAudio has CUDA version 11.7. Please install the TorchAudio version that matches your PyTorch version.升级版本即可 pi…

HTML导航栏二级菜单(垂直、水平方向)

二级菜单是指主菜单的子菜单。菜单栏实际是一种树型结构&#xff0c;子菜单是菜单栏的一个分支。简单分享主要的垂直和水平方向的CSS设计。 垂直方向&#xff1a; HTML: <body><div><ul><li><a href"#">家用电器</a><ul>…

VRTK4⭐三.VRTK4 : 射线传送模块 [包含API传送]

文章目录 &#x1f7e5; 项目配置方法1️⃣ 添加相应模块2️⃣ 配置相关属性3️⃣ 体验一下吧 &#x1f7e7; 传送组件讲解&#x1f7e8; Locomotors.Teleporter.Dash : 缓动传送&#x1f7e9; API 传送示例 &#x1f7e5; 项目配置方法 1️⃣ 添加相应模块 我们要实现的功能…

10:STM32------I2C通信

目录​​​​​​​ 一:I2C通信协议 1:I2C简历 2:硬件电路 3:I2C时序基本单元 A : 开/ 终条件 2:发送一个字节 3:接收一个字节 4:应答机制 4:I2C时序 1:指定地址写 2:当前地址读 3: 指定地址读 二:MPU6050 1:简历 2:参数 3:硬件电路 4:框图 5:寄存器地址 …

weblogic配置证书

1.windows安装jdk JDK 可以到官网下载 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 系统变量→新建 JAVA_HOME 变量 配置环境变量&#xff1a;右击“我的电脑”–>“高级”–>“环境变量” JAVA_HOME&#xff1a;D:\Java\j…

原型链(一定要搞懂啊!!!>-<)

一、概念 1、prototype 习惯称作“显示原型”&#xff0c;只有构造函数才有的属性。 2、构造函数 能用new关键字创建的对象叫做构造函数 3、__proto__ 习惯称作“隐式原型”&#xff0c;每一个实例都有的属性&#xff0c;该属性指向他构造函数的“显示原型”。Function对象…

iwebsec靶场 文件包含漏洞通关笔记2-文件包含绕过(截断法)

目录 前言 1.%00截断 2.文件字符长度截断法&#xff08;又名超长文件截断) 方法1&#xff08;路径截断法&#xff09; 方法2&#xff08;点号截断法&#xff09; 第02关 文件包含绕过 1.打开靶场 2.源码分析 3.00文件截断原理 4.00截断的条件 5.文件包含00截断绕过 …