当前位置: 首页 > news >正文

enable_shared_from_this

用途:

enable_shared_from_this 是一个基类模板,用于解决在类成员函数中获取类对象的 shared_ptr 的需求。它提供了一种机制,使类能够安全地从成员函数内部获得指向自身的 shared_ptr

  1. 解决对象生命周期管理问题:在某些情况下,需要在类的成员函数中获取指向同一对象的 shared_ptr,以确保对象在函数执行期间不被销毁。而直接使用 shared_ptr 可能会导致循环引用,造成内存泄漏。enable_shared_from_this 提供了一种避免循环引用的方法,通过调用 shared_from_this() 函数获取指向自身的 shared_ptr,而不会增加引用计数。
  2. 安全地传递对象引用:有时候需要将类对象作为参数传递给其他函数或线程,以确保对象的有效性和一致性。使用 shared_ptr 可以方便地传递对象的共享所有权,从而避免对象在使用过程中被意外销毁。

所以引用带着两层含义:

  • 自己引用自己,且不能增加引用计数,用enable_shared_from_this
  • other引用自己,且不能增加引用计数,用weak_ptr

下面是一个示例代码,展示了 enable_shared_from_this 的用法:

#include <iostream>
#include <memory>class MyClass : public std::enable_shared_from_this<MyClass>
{
public:std::shared_ptr<MyClass> getShared(){return shared_from_this();}
};int main()
{std::shared_ptr<MyClass> obj1 = std::make_shared<MyClass>();std::shared_ptr<MyClass> obj2 = obj1->getShared();std::cout << "obj1 use count: " << obj1.use_count() << std::endl;  // 输出为2std::cout << "obj2 use count: " << obj2.use_count() << std::endl;  // 输出为2return 0;
}
C:\Users\yuyi.di\CLionProjects\untitled\cmake-build-debug\untitled.exe
obj1 use count: 2
obj2 use count: 2

shared_from_this()不能在构造函数里调用,因为在构造对象的时候,它还没有被交给shared_ptr接管。

该类的定义:

  template<typename _Tp>class enable_shared_from_this{protected:enable_shared_from_this() { }enable_shared_from_this(const enable_shared_from_this&) { }enable_shared_from_this&operator=(const enable_shared_from_this&){ return *this; }~enable_shared_from_this() { }public:shared_ptr<_Tp>shared_from_this(){ return shared_ptr<_Tp>(this->_M_weak_this); }shared_ptr<const _Tp>shared_from_this() const{ return shared_ptr<const _Tp>(this->_M_weak_this); }private:template<typename _Tp1>void_M_weak_assign(_Tp1* __p, const __shared_count<>& __n) const{ _M_weak_this._M_assign(__p, __n); }template<typename _Tp1>friend void__enable_shared_from_this_helper(const __shared_count<>& __pn,const enable_shared_from_this* __pe,const _Tp1* __px){if (__pe != 0)__pe->_M_weak_assign(const_cast<_Tp1*>(__px), __pn);}mutable weak_ptr<_Tp>  _M_weak_this;};

相关文章:

enable_shared_from_this

用途&#xff1a; enable_shared_from_this 是一个基类模板&#xff0c;用于解决在类成员函数中获取类对象的 shared_ptr 的需求。它提供了一种机制&#xff0c;使类能够安全地从成员函数内部获得指向自身的 shared_ptr。 解决对象生命周期管理问题&#xff1a;在某些情况下&…...

weak_ptr是怎么探知对象生死的

weak_ptr是C智能指针中的一种。它用于解决共享所有权的问题&#xff0c;并且可以避免因循环引用而导致的内存泄漏。 weak_ptr本身并不承担对象的所有权&#xff0c;它指向由shared_ptr管理的对象。与shared_ptr不同&#xff0c;weak_ptr并不会增加计数器来计算对象的引用次数。…...

⌈算法进阶⌋图论::拓扑排序(Topological Sorting)——快速理解到熟练运用

目录 一、原理 1. 引例&#xff1a;207.课程表 2. 应用场景 3. 代码思路 二、代码模板 三、练习 1、210.课程表Ⅱ&#x1f7e2; 2、2392.给定条件下构造举证&#x1f7e1; 3、310.最小高度树 &#x1f7e1; 一、原理 1. 引例&#xff1a;207.课程表 就如大学课程安排一样&…...

【Python】【数据结构和算法】保留最后N个元素

使用deque&#xff0c;指定maxlen参数的值为N&#xff0c;例如&#xff1a; >>> from collections import deque >>> dq deque(maxlen3) >>> dq.append(1) >>> dq.append(2) >>> dq.append(3) >>> dq.append(4) >&…...

wireshark 基本使用

在Wireshark中&#xff0c;你可以使用过滤器来根据接口名称定位到特定的包。下面是一些常见的过滤器示例&#xff1a; 根据源或目的IP地址过滤&#xff1a; ip.src 192.168.0.1&#xff1a;过滤源IP地址为192.168.0.1的包。ip.dst 192.168.0.1&#xff1a;过滤目的IP地址为…...

2、结构型设计模式

结构型设计模式 目录 结构型设计模式1. 代理模式1.1 概述1.2 结构1.3 静态代理1)抽象主题类 SellTickets2)真实主题类 TrainStation3)代理类 ProxyPoint4)客户端类1.4 JDK 动态代理1)代理工厂类:ProxyFactory2)客户端类3)JDK 动态代理原理4)动态代理的执行流程是什么样…...

JavaScript下载excel文件

文章目录 通过链接下载a标签下载方法注意 获取文件流请求体配置下载文件流 总结 通过链接下载 a标签 对于已知地址的目标文件&#xff0c;前端可以使用 a标签 来直接下载&#xff0c;使用a标签下载使用到两个属性 download&#xff1a;下载文件名href&#xff1a;目标文件下…...

研磨设计模式day12命令模式

目录 定义 几个参数 场景描述 代码示例 参数化设置 命令模式的优点 本质 何时选用 定义 几个参数 Command&#xff1a;定义命令的接口。 ConcreteCommand:命令接口的实现对象。但不是真正实现&#xff0c;是通过接收者的功能来完成命令要执行的操作 Receiver&#x…...

设计模式 06 适配器模式

适配器模式&#xff08;Adapter Pattern&#xff09;属于结构型模式 概述 结构型模式关注如何将现有的类或对象组织在一起形成更加强大的结构。 在生活中&#xff0c;我们经常遇到这样的一个问题&#xff1a;轻薄笔记本通常只有 type-c 或者 usb-a 接口&#xff0c;没有网口。…...

UE4/5Niagara粒子特效之Niagara_Particles官方案例:3.3->4.3

目录 3.3 Visibility Tag 左边的发射器&#xff1a; 发射器更新 粒子生成 粒子更新 右边的发射器 和左边发射器不同的地方 3.4 Texture Sampling 发射器更新 粒子生成 粒子更新 4.1Play Audio Per Particle 系统 第三个发射器 发射器更新 粒子生成 粒子更新 第二个…...

数据结构队列的实现

本章介绍数据结构队列的内容&#xff0c;我们会从队列的定义以及使用和OJ题来了解队列&#xff0c;话不多说&#xff0c;我们来实现吧 队列 1。队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;…...

Gti的基本介绍和使用方式

Git 是一种分布式版本控制系统, 主要用于管理软件开发过程中的代码变更。其基本概念包括: 仓库 (Repository): Git中存储代码的基本单位&#xff0c;即一个代码库。在仓库中可以存储多个分支、标签、提交记录等。 分支 (Branch): Git中的分支是代码的不同开发方向&#xff0c;…...

剑指Offer 24-反转链表

题目描述&#xff1a;定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 解题思路&#xff1a; 这道题做过很多次&#xff0c;还是会…...

小研究 - Java虚拟机即时编译器的一种实现原理

深入分析了 &#xff2b;&#xff41;&#xff46;&#xff46;&#xff45;虚拟机的 &#xff2a;&#xff29;&#xff34;&#xff08;&#xff2a;&#xff55;&#xff53;&#xff54;&#xff0d;&#xff29;&#xff4e;&#xff0d;&#xff34;&#xff49;&#xf…...

【LeetCode】416.分割等和子集

题目 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分割成 [1, 5, 5] 和 [11] 。 示…...

go vet中的那些检测项

go vet 是 Go 语言自带的一个工具&#xff0c;用于分析 Go 代码中的常见错误和潜在问题。它可以检查代码中可能存在的各种问题&#xff0c;例如&#xff1a; 未使用的变量、函数或包 可疑的函数调用 错误的函数签名 程序中的竞态条件 错误的类型转换等 本文意图指令当前go vet所…...

Qt 自定义菜单、右键菜单

在接触Qt这段时间以来&#xff0c;经常遇到菜单项的问题&#xff08;右键菜单、托盘菜单、按钮菜单等&#xff09;&#xff0c;QMenu用于菜单栏,上下文菜单,弹出菜单等&#xff0c;利用QMenuQAction就可以达到效果&#xff01; 右键菜单实现&#xff1a;通过重写contextMenuEv…...

VScode 编辑器报错: ‘HelloWorld‘ is declared but its value is never read.

.vue文件被标识红色波浪线&#xff1b;提示&#xff1a; HelloWorld is declared but its value is never read. 问题原因&#xff1a; 因为vue3已经不支持vetur插件。 1、在扩展里面进行搜索Vetur插件&#xff0c;进行禁用或卸载&#xff1b; 2、在 VScode扩展里面搜索并下载…...

如何使用LLM实现文本自动生成视频

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 介绍 基于扩散的图像生成模型代表了计算机视觉领域的革命性突破。这些进步由Imagen&#xff0c;DallE和MidJourney等模型开创&#xff0c;展示了文本条件图像生成的卓越功能。有关这些模型内部工作的…...

Rust处理JSON

基本操作 Cargo.toml: [package]name "json"version "0.1.0"edition "2021"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies]serde { version "1", features …...

OpenClaw 微信接入指南:从安装到绑定,一步到位

下载地址&#xff1a;OpenClaw Windows 一键部署包 https://xiake.yun/api/download/package/16?promoCodeIV9D9D5198DC OpenClaw 绑定微信教程 1&#xff1a;软件下载完成界面 2&#xff1a;选择右上角设置 3&#xff1a;选择聊天配置 4&#xff1a;选择右边展开&#xff…...

企业级GPU显存稳定性测试完整方案:memtest_vulkan深度解析与高级指南

企业级GPU显存稳定性测试完整方案&#xff1a;memtest_vulkan深度解析与高级指南 【免费下载链接】memtest_vulkan Vulkan compute tool for testing video memory stability 项目地址: https://gitcode.com/gh_mirrors/me/memtest_vulkan Vulkan计算驱动的GPU显存稳定性…...

如何快速掌握Switch-Toolbox:终极任天堂游戏文件编辑完整指南

如何快速掌握Switch-Toolbox&#xff1a;终极任天堂游戏文件编辑完整指南 【免费下载链接】Switch-Toolbox A tool to edit many video game file formats 项目地址: https://gitcode.com/gh_mirrors/sw/Switch-Toolbox 如果你一直想修改任天堂Switch、3DS或Wii U游戏文…...

3分钟完成缠论分析:ChanlunX通达信插件实现自动画中枢

3分钟完成缠论分析&#xff1a;ChanlunX通达信插件实现自动画中枢 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 还在为缠论分析的手动画线而烦恼吗&#xff1f;ChanlunX缠论插件为你带来终极解决方案&a…...

通过curl命令快速测试Taotoken接口连通性与模型响应效果

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过curl命令快速测试Taotoken接口连通性与模型响应效果 对于开发者而言&#xff0c;在集成大模型服务时&#xff0c;快速验证接口…...

3DS Pokémon ROM 编辑器 pk3DS:新手入门完全指南

3DS Pokmon ROM 编辑器 pk3DS&#xff1a;新手入门完全指南 【免费下载链接】pk3DS Pokmon (3DS) ROM Editor & Randomizer 项目地址: https://gitcode.com/gh_mirrors/pk/pk3DS pk3DS 是一款功能强大的任天堂 3DS 平台 Pokmon 系列游戏 ROM 编辑器和随机化工具&…...

XCOM 2模组管理器终极指南:为什么AML是你的最佳选择?

XCOM 2模组管理器终极指南&#xff1a;为什么AML是你的最佳选择&#xff1f; 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh…...

首次购买Token Plan套餐,在真实项目中的成本控制效果初探

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 首次购买Token Plan套餐&#xff0c;在真实项目中的成本控制效果初探 1. 项目背景与成本考量 作为一名独立开发者&#xff0c;我最…...

跳出传统 RAG!用 LLM Wiki 构建闭环式产品 Agent 协作体系

这段时间我在了解 LLM Wiki 之后&#xff0c;把它当成一套「私域知识库 Agent 工作流」的底座&#xff0c;做了一次具体实践。这篇文章主要想记录我对 LLM Wiki 的理解&#xff0c;以及我怎么基于这套思路去构建一个产品 Agent&#xff1a;知识库如何组织&#xff0c;产品工作…...

如何在10分钟内搭建个人游戏云:Sunshine跨平台游戏串流终极指南

如何在10分钟内搭建个人游戏云&#xff1a;Sunshine跨平台游戏串流终极指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想要在任何设备上畅玩PC游戏吗&#xff1f;厌倦了被硬件…...