c++ std::enable_shared_from_this 的作用

C++ std::enable_shared_from_this 类模板到底有什么用?【 C++11 标准中正式引入】 本文介绍了C++中std::enable_shared_from_this模板的用法,通过HttpServer示例说明其重要性。在异步回调中直接使用this指针可能导致对象提前销毁引发未定义行为,而shared_from_this()通过共享所有权确保对象生命周期延长到异步操作完成。文章分析了其工作原理:shared_from_this()会创建新的shared_ptr副本,增加引用计数,直到回调执行完毕才可能释放对象。该模板是解决异步操作中对象生命周期问题的标准工具,能有效防止悬空指针问题。 阅读详情

在类的内部获取shared_ptr是在所难免的。

举个例子:

在日常c++编程中,为了更好的管理资源,我们通常借助shared_ptr来达到对资源的自动管理。由于其原理是通过过跟踪引用计数实现的,也就是说在使用了shared_ptr后就不能再使用裸指针this。比如说在类的内部直接使用std::shared_ptr<XX>(this),就会导致智能指针失效。

常见的场景:

通过std::bind生成functor函数传递给其他实例时(暴露了this),当其他实例调用functor函数时,该实例有可能已经被析构,会引起异常。

首先我们看下shared_ptr的用法,

class Test{
        public:
                Test() {
                        a = 123;
                        std::cout << "construct\n";
                };
                void func() {
                        std::cout << "test func called data="<< a << "\n";
                };
                ~Test() {
                        std::cout << "destroy\n";
                };
        private:
                int a;
};


int main()
{
        {
                std::shared_ptr<Test> b(new Test());
                b->func();
        }
}

// construct
// test func called data=123
// destroy

在某些情况,当我们在func内部将this传递给其他对象后,由于使用了裸指针,导致shared_ptr无法正常跟踪计数。最终Test会被析构两次,导致未定义行为。下面的代码展示了这个问题。


#include <memory>
#include <iostream>
 
class Test
{
public:
	std::shared_ptr<Test> getptr() {
		return std::shared_ptr<Test>(this);
	}
	~Test() { std::cout << "Test::~Test() called" << std::endl; }
};
 
int main()
{

	std::shared_ptr<Test> a(new Test());
	std::shared_ptr<Test> b = a->getptr();

	std::cout << "a.use_count() = " << a.use_count() << std::endl; // 1
	std::cout << "b.use_count() = " << b.use_count() << std::endl; // 1

}

使用 enable_shared_from_this来修正这个问题

#include <memory>
#include <iostream>

class Test :public std::enable_shared_from_this<Test>
{
public:
        std::shared_ptr<Test> getptr() {
                return shared_from_this();
        }
        ~Test() { std::cout << "Test::~Test() called" << std::endl; }
};

int main()
{

        std::shared_ptr<Test> a(new Test());
        std::shared_ptr<Test> b = a->getptr();

        std::cout << "a.use_count() = " << a.use_count() << std::endl; // 2
        std::cout << "b.use_count() = " << b.use_count() << std::endl; // 2

}

这样shared_ptr就能正确的取得计数。避免了在内部无法正确取得shared_ptr的困境。

C++中std::enable_shared_from_this<> 的用法 std::enable_shared_from_this 阅读详情

相关推荐

C++之智能指针std::shared_ptr简单使用和理解

1 智能指针std::shared_ptr相关知识和如何使用 我们这里先说下智能指针std::shared_ptr,因为我看到我我们项目c++代码里面用得很多,我不是不会,所以记录学习下 先让ubuntu终端支持c++11,如果自己的电脑还没配置号,可以先看下我的这篇博客linux之让终端支持C++11/14编译cpp文件 1) 所在的头文件 #include &lt;memo...

码莎拉蒂 6万+

C++ std::enable_shared_from_this

std::enable_shared_from_this 能让一个对象(假设其名为 t ,且已被一个 std::shared_ptr 对象 pt 管理)安全地生成其他额外的 std::shared_ptr 实例(假设名为 pt1, pt2, ... ) ,它们与 pt 共享对象 t 的所有权。 若一个类 T 继承 std::enable_shared_from_this<T> ,则会为该类 T 提供成员函数: shared_from_this() 。 ...

软件工程小施同学 的专栏 1159

Silvaco TCAD 2018安装后,如何配置TonyPlot 5.0.22.R并解决绘图报错?

本文详细介绍了在Windows系统上安装Silvaco TCAD 2018后,如何正确配置TonyPlot 5.0.22.R并解决常见的绘图报错问题。内容包括版本兼容性分析、环境变量设置、常见错误解决方案以及性能优化建议,帮助用户顺利完成仿真结果的可视化工作。

weixin_31031711的博客 420

C++编程: 使用 std::enable_shared_from_this 解决多线程悬空指针(智能指针失效)

在C++11多线程编程中,很容易遇到std::shared_ptr的悬空指针(智能指针失效)问题。而 `std::enable_shared_from_this` 可以避免在多线程环境中因对象提前销毁而导致的`std::shared_ptr`悬空指针。 本文将详细介绍`std::enable_shared_from_this

Where there is life, there is hope. 1861

一次渗透测试引发的Json格式下CSRF攻击的探索

一次渗透测试引发的Json格式下CSRF攻击的探索

weixin_52501704的博客 1046

【电子元件篇】MOSFET场效应管作用、选型和测量指南-超简单解读

场效应管是一种电压控制型半导体器件,相比三极管具有输入阻抗高、噪声小、功耗低等优势。主要分为结型和绝缘栅型两大类,后者又可分为耗尽型和增强型MOS管。场效应管通过栅极电压控制漏极电流,具有转移特性和输出特性两大静态特性,以及快速的开关特性。其关键参数包括饱和漏源电流、夹断电压、跨导等,应用场景涵盖信号放大、恒流源、阻抗变换等领域。使用时需根据电路需求选择合适类型,如结型管适合一般放大,功率MOSFET适合高压大电流场合。检测时可用万用表电阻档初步判断好坏和放大能力。

2301_81299416的博客 2540

详解`std::enable_shared_from_this`

是 C++ 标准库中的一个模板类,用于解决在类的成员函数中需要将this指针作为使用的问题。通过继承,类可以获得一个安全的方法,用于返回当前对象的。

qq_56921730的博客 1377

【Mode】Mode expansion monitors

对于宽带仿真,因为被支持的模式可能是波长的函数,因此,推荐在波长范围内增加频率的采样点数量去计算支持的波导模式分布或者光纤模式分布。对于宽带仿真,如果在被计算模式上的频率点的数量与通过 frequency-domain monitors 被测量的频率点的数量不匹配,这种情况是正常的。Mode expansion monitors 对于仿真偏振转换器是十分有用的,比如,在偏振转换器中,当你想要提取从输入模式到输出模式的转换效率,或者提取一个装置的 S 参数。给出了进入到被选择模式中的合透射率,

u011699626的博客 2760

C++ std::enable_shared_from_this知识点整理

1、std::enable_shared_from_this enable_shared_from_this是一个模板类,具体调用时头文件如下: #include <memory> 其定义如下: /** * @brief Base class allowing use of member function shared_from_this. */ template<typename _Tp> class enable_shared_from_this

给大佬递杯卡布奇诺的博客 954

starrc: LEF DEF FLOW与full chip flat netlist

SIKP_CELLS默认为"SKIP_CELLS: *"意思是跳过所有ref cell内部的rc提取,仅提取cell之间的互联线的rc,"SKIP_CELLS: *!与MACRO_DEF_FILE搭配使用的还有SKIP_CELLS命令,如果想提取block的寄生参数生成full chip的flat netlist,或者跳过block取执行hier的寄生参数提取都需要用到SKIP_CELLS。此时,macroA和macroB没有被跳过,所以提取其内部的rc,spef中存在两个A和两个B。

m0_61544122的博客 551

YOLO11的持续学习:如何在不遗忘旧数据的情况下学习新类别

类增量学习(Class-Incremental Learning, CIL)是持续学习(Continual Learning)的一个重要分支,它指的是模型在不遗忘已学旧类别知识的前提下,逐步学习新类别的能力。与传统机器学习假设所有数据一次可用不同,类增量学习更贴近现实世界应用场景——新的类别数据往往会随着时间推移逐步出现。 举个例子,假设我们已经训练好一个YOLOv11模型用于检测"猫"和"狗"两种动物,现在需要让模型新增识别"兔子"的能力。传统方法需要收集所有类别(猫、狗、兔子)的数据重新训练,而类增量

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1966

C++ std::enable_shared_from_this<T>的作用

std::enable_shared_from_this<T>的作用及代码举例

m0_43405630的博客 348

基于未来出行解决方案的场景实例:城市空中交通(UAM)的飞行路径规划与避障

本文介绍了使用Simulink进行城市空中交通(UAM)飞行路径规划与避障的仿真方法。主要内容包括:1)UAM系统架构与核心挑战;2)详细建模步骤,从城市3D环境构建到飞行器动力学模拟;3)全局路径规划(A*/RRT*)和局部避障(DWA/APF)算法实现;4)多机协同与冲突解决;5)关键场景仿真与性能评估;6)高级功能拓展方向。通过Simulink的数字孪生系统,可有效验证UAM在复杂城市环境中的可行性,为未来立体交通发展提供技术支撑。

xiaoheshang_123的博客 257

c++ std::enable_shared_from_this作用

std::enable_shared_from_this作用

weixin_46935110的博客 5939

内容创作全流程自动化:OpenClaw+大模型搞定选题+写稿+多平台发布

本文介绍了一套基于OpenClaw的全自动化内容创作流水线方案,帮助垂直领域创作者摆脱重复劳动。该方案将内容生产拆解为选题生成、内容撰写、格式适配、多平台发布四个模块,通过工作流引擎串联执行。系统能自动采集热榜生成选题、调用大模型撰写结构化内容、适配不同平台格式要求,并通过API+浏览器自动化实现多平台发布,全程只需人工最终审核。作者分享了各模块的实现细节,包括热榜采集、内容结构化生成、Markdown转换和发布策略,并提供了工作流编排方法。这套方案能为创作者每天节省约3小时,同时保证内容质量和发布效率。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 49

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C++基础:std::enable_shared_from_this的作用

使用share_ptr管理自定义类型存在的问题 ​#include <memory> #include <iostream> class B { public: void func() { // 1.使用this裸指针进行共享指针的初始化 std::shared_ptr<B> local_sp_b(this); // 2.local_sp_b限定在作用域内,计数为1 std::cout &lt.

在么升龙拳的博客 411

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

c++11 智能指针-辅助类 (std::enable_shared_from_this)

std::enable_shared_from_this 能让其一个对象(假设其名为 t ,且已被一个 std::shared_ptr 对象 pt 管理)安全地生成其他额外的 std::shared_ptr 实例(假设名为 pt1, pt2, ... ) ,它们与 pt 共享对象 t 的所有权。

qq_40788199的博客 2040

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【C++ 11】 std::enable_shared_from_this

C++11 std::enable_shared_from_this 一 介绍 1 申明 std::enable_shared_from_this template< class T > class enable_shared_from_this;(C++11 起) std::enable_shared_from_this 能让其一个对象(假设其名为 t ,且已被一个 std::shared_ptr 对象 pt 管理)安全地生成其他额外的 std::shared_ptr 实例(假设名为 pt1

qq_43331089的博客 455

enable_shared_from_this类的作用和实现

目录 问题:如何安全地将this指针返回给调用者 enable_shared_from_this的实现分析 问题:如何安全地将this指针返回给调用者 一般来说,我们不能直接将this指针返回。 想象这样的情况,该函数将this指针返回到外部某个变量保存,然后这个对象自身已经析构了,但外部变量并不知道,此时如果外部变量使用这个指针,就会使得程序崩溃。 使用智能指针shared_ptr看起来是个不错的解决方法。但问题是如何去使用它呢?我们来看如下代码: struct Bad { std:.

weixin_43606861的博客 1001

c++之shared_from_this

学习博客: https://blog.youkuaiyun.com/zk3326312/article/details/79108690 https://zhuanlan.zhihu.com/p/348650382 https://blog.youkuaiyun.com/u013745174/article/details/52900870?ops_request_misc=&request_id=&biz_id=102&utm_term=enable_shared_from_this&utm_me

wangkai6666的博客 1870

C++之智能指针std::shared_ptr简单总结

std::shared_ptr的主要作用如下: 1、智能指针主要的用途就是方便资源的管理,自动释放没有指针引用的资源。 2、使用引用计数来标识是否有多余指针指向该资源。(注意,shart_ptr本身指针会占1个引用) 可以用shared_ptr.use_count()函数查看这个智能指针的引用计数,一旦最后一个这样的指针被销毁,也就是一旦某个对象的引用计数变为0,这个对象会被自动删除 #...

misterdo的专栏 9522

C++11 std::enable_shared_from_this

一 介绍 1 申明 std::enable_shared_from_this template&lt; class T &gt; class enable_shared_from_this;(C++11 起) std::enable_shared_from_this 能让其一个对象(假设其名为 t ,且已被一个 std::shared_ptr 对象 pt 管理)安全地生成其他额外的 std...

程序员Link 1258

c++学习记录-4

它可以将任何类型转换为任何其他类型,只要两个类型在二进制表示上是兼容的。在头文件中使用static关键字声明一个静态变量m_simulate_config,表明它是一个类的所有对象共享的变量。是一种非常强制的类型转换,它不会进行任何类型检查,因此在使用时需要确保转换是安全和正确的。是 C++11 中的一个模板类,用于支持在类的成员函数中安全地获取指向当前对象的。模板类,通过继承该类,可以安全地在对象内部的成员函数中获取指向当前对象的。管理对象资源时,有时需要在对象内部的成员函数中获取指向当前对象的。

qq_33243369的博客 408

详解std::enable_shared_from_this

是一个工具,用于让一个已经被管理的对象能够安全地获取指向自身的。核心方法是,它返回一个与现有shared_ptr共享所有权的shared_ptr。核心原理是基类内部维护了一个weak_ptr,当第一个shared_ptr指向对象时,这个weak_ptr被初始化。就是通过来获取shared_ptr的。使用条件类必须公有继承。对象必须由管理。不要在构造函数中调用。典型应用场景需要将对象自身的指针作为参数传递给其他函数,同时希望延长对象的生命周期。在异步回调中,确保回调执行时对象仍然有效。

C/C++ 1124
上一篇: 超简单的分布式任务实现
下一篇: 基于swoole的websocket聊天室设计实现
Sweet_Oranges
博客等级 码龄12年 1粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值