enable_shared_from_this
用途:
enable_shared_from_this 是一个基类模板,用于解决在类成员函数中获取类对象的 shared_ptr 的需求。它提供了一种机制,使类能够安全地从成员函数内部获得指向自身的 shared_ptr。
- 解决对象生命周期管理问题:在某些情况下,需要在类的成员函数中获取指向同一对象的
shared_ptr,以确保对象在函数执行期间不被销毁。而直接使用shared_ptr可能会导致循环引用,造成内存泄漏。enable_shared_from_this提供了一种避免循环引用的方法,通过调用shared_from_this()函数获取指向自身的shared_ptr,而不会增加引用计数。 - 安全地传递对象引用:有时候需要将类对象作为参数传递给其他函数或线程,以确保对象的有效性和一致性。使用
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
用途: enable_shared_from_this 是一个基类模板,用于解决在类成员函数中获取类对象的 shared_ptr 的需求。它提供了一种机制,使类能够安全地从成员函数内部获得指向自身的 shared_ptr。 解决对象生命周期管理问题:在某些情况下&…...
weak_ptr是怎么探知对象生死的
weak_ptr是C智能指针中的一种。它用于解决共享所有权的问题,并且可以避免因循环引用而导致的内存泄漏。 weak_ptr本身并不承担对象的所有权,它指向由shared_ptr管理的对象。与shared_ptr不同,weak_ptr并不会增加计数器来计算对象的引用次数。…...
⌈算法进阶⌋图论::拓扑排序(Topological Sorting)——快速理解到熟练运用
目录 一、原理 1. 引例:207.课程表 2. 应用场景 3. 代码思路 二、代码模板 三、练习 1、210.课程表Ⅱ🟢 2、2392.给定条件下构造举证🟡 3、310.最小高度树 🟡 一、原理 1. 引例:207.课程表 就如大学课程安排一样&…...
【Python】【数据结构和算法】保留最后N个元素
使用deque,指定maxlen参数的值为N,例如: >>> from collections import deque >>> dq deque(maxlen3) >>> dq.append(1) >>> dq.append(2) >>> dq.append(3) >>> dq.append(4) >&…...
wireshark 基本使用
在Wireshark中,你可以使用过滤器来根据接口名称定位到特定的包。下面是一些常见的过滤器示例: 根据源或目的IP地址过滤: ip.src 192.168.0.1:过滤源IP地址为192.168.0.1的包。ip.dst 192.168.0.1:过滤目的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标签 对于已知地址的目标文件,前端可以使用 a标签 来直接下载,使用a标签下载使用到两个属性 download:下载文件名href:目标文件下…...
研磨设计模式day12命令模式
目录 定义 几个参数 场景描述 代码示例 参数化设置 命令模式的优点 本质 何时选用 定义 几个参数 Command:定义命令的接口。 ConcreteCommand:命令接口的实现对象。但不是真正实现,是通过接收者的功能来完成命令要执行的操作 Receiver&#x…...
设计模式 06 适配器模式
适配器模式(Adapter Pattern)属于结构型模式 概述 结构型模式关注如何将现有的类或对象组织在一起形成更加强大的结构。 在生活中,我们经常遇到这样的一个问题:轻薄笔记本通常只有 type-c 或者 usb-a 接口,没有网口。…...
UE4/5Niagara粒子特效之Niagara_Particles官方案例:3.3->4.3
目录 3.3 Visibility Tag 左边的发射器: 发射器更新 粒子生成 粒子更新 右边的发射器 和左边发射器不同的地方 3.4 Texture Sampling 发射器更新 粒子生成 粒子更新 4.1Play Audio Per Particle 系统 第三个发射器 发射器更新 粒子生成 粒子更新 第二个…...
数据结构队列的实现
本章介绍数据结构队列的内容,我们会从队列的定义以及使用和OJ题来了解队列,话不多说,我们来实现吧 队列 1。队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,…...
Gti的基本介绍和使用方式
Git 是一种分布式版本控制系统, 主要用于管理软件开发过程中的代码变更。其基本概念包括: 仓库 (Repository): Git中存储代码的基本单位,即一个代码库。在仓库中可以存储多个分支、标签、提交记录等。 分支 (Branch): Git中的分支是代码的不同开发方向,…...
剑指Offer 24-反转链表
题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 解题思路: 这道题做过很多次,还是会…...
小研究 - Java虚拟机即时编译器的一种实现原理
深入分析了 Kaffe虚拟机的 JIT(Just-In-Ti…...
【LeetCode】416.分割等和子集
题目 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums [1,5,11,5] 输出:true 解释:数组可以分割成 [1, 5, 5] 和 [11] 。 示…...
go vet中的那些检测项
go vet 是 Go 语言自带的一个工具,用于分析 Go 代码中的常见错误和潜在问题。它可以检查代码中可能存在的各种问题,例如: 未使用的变量、函数或包 可疑的函数调用 错误的函数签名 程序中的竞态条件 错误的类型转换等 本文意图指令当前go vet所…...
Qt 自定义菜单、右键菜单
在接触Qt这段时间以来,经常遇到菜单项的问题(右键菜单、托盘菜单、按钮菜单等),QMenu用于菜单栏,上下文菜单,弹出菜单等,利用QMenuQAction就可以达到效果! 右键菜单实现:通过重写contextMenuEv…...
VScode 编辑器报错: ‘HelloWorld‘ is declared but its value is never read.
.vue文件被标识红色波浪线;提示: HelloWorld is declared but its value is never read. 问题原因: 因为vue3已经不支持vetur插件。 1、在扩展里面进行搜索Vetur插件,进行禁用或卸载; 2、在 VScode扩展里面搜索并下载…...
如何使用LLM实现文本自动生成视频
推荐:使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 介绍 基于扩散的图像生成模型代表了计算机视觉领域的革命性突破。这些进步由Imagen,DallE和MidJourney等模型开创,展示了文本条件图像生成的卓越功能。有关这些模型内部工作的…...
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 …...
DownKyi如何成为B站视频下载的智能管家?8K高清+批量处理全解析
DownKyi如何成为B站视频下载的智能管家?8K高清批量处理全解析 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等…...
技术洞察:如何通过数据预处理优化clip命令行图表生成性能
技术洞察:如何通过数据预处理优化clip命令行图表生成性能 【免费下载链接】clip Create charts from the command line 项目地址: https://gitcode.com/gh_mirrors/cli/clip 在数据可视化领域,clip作为一个命令行驱动的图表生成工具,为…...
BiliTools:跨平台B站资源管理工具的全方位应用指南
BiliTools:跨平台B站资源管理工具的全方位应用指南 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持视频、音乐、番剧、课程下载……持续更新 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliToo…...
Linux栈机制解析:进程栈、线程栈与内核栈
Linux系统中的栈机制深度解析:进程栈、线程栈、内核栈与中断栈1. 栈的基本原理与硬件实现栈(Stack)是一种后入先出(LIFO)的串列数据结构,在计算机体系结构中具有重要作用。硬件层面,大多数处理器架构都实现了专门的栈机制:栈指针寄…...
鸿蒙ArkTS项目避坑指南:从零搭建外卖应用时,我踩过的那些‘坑’
鸿蒙ArkTS实战避坑手册:外卖应用开发中的12个致命陷阱 第一次在DevEco Studio里看到ArkTS的语法高亮时,我以为这不过是又一个前端框架的变种——直到我的外卖应用项目在模拟器上连续崩溃了七次。作为从Android原生开发转向鸿蒙的"老手"&#x…...
解锁Stable Diffusion隐藏玩法:用ChatGPT批量生成动漫角色Prompt全攻略
从零到大师:ChatGPT与Stable Diffusion打造专属动漫角色的终极指南 在数字艺术创作领域,AI绘画工具正掀起一场前所未有的革命。想象一下,你脑海中那个独特的动漫角色形象,不再需要数月的美术训练就能实现——只需要正确的工具组合…...
太阳能电池阵列监测实战:用AMC1301搞定200V共模电压下的单体电压采集
太阳能电池阵列单体电压监测:基于AMC1301的高压隔离采集方案设计指南 光伏电站的电池阵列通常由数十至数百块单体电池串联组成,系统电压可达600-1500V。在这种高压堆叠场景下,如何准确监测每块单体电池的电压(通常仅0.5-0.7V&…...
别再让输入框‘抢焦点’了!手把手封装一个Vue扫码枪工具类SCAN,解决页面刷新监听丢失
从零构建高可靠Vue扫码枪工具库:SCAN类深度封装与工程化实践 扫码枪在零售、仓储、医疗等行业的Web系统中应用广泛,但传统实现强依赖输入框焦点,用户体验差且稳定性低。本文将带你从底层原理出发,完整封装一个无需输入框聚焦、支持…...
构建智能游戏AI的理想训练场:腾讯王者荣耀AI开放环境全解析
构建智能游戏AI的理想训练场:腾讯王者荣耀AI开放环境全解析 【免费下载链接】hok_env Honor of Kings AI Open Environment of Tencent 项目地址: https://gitcode.com/gh_mirrors/ho/hok_env 强化学习研究如何突破理论到实践的鸿沟?如何在真实游…...
别再只调参了!从NeurIPS 2025看时间序列预测的7个新思路:标签对齐、隐式解码与后处理修正
别再只调参了!从NeurIPS 2025看时间序列预测的7个新思路:标签对齐、隐式解码与后处理修正 当算法工程师们还在为LSTM的超参数调优争论不休时,NeurIPS 2025的最新研究已经将时间序列预测推向了全新的技术范式。这场全球顶会揭示了一个关键趋势…...
