全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++的std::shared_from_this有什么用 安全地获取this的shared_ptr【智能指针】

std::shared_from_this用于已由shared_ptr管理的对象安全获取共享引用计数的shared_ptr;直接new shared_ptr(this)会创建独立控制块导致双重析构;必须公有继承enable_shared_from_this,并确保对象已被shared_ptr持有后才能调用。

std::shared_from_this 的作用是让一个已由 std::shared_ptr 管理的对象,能在成员函数内部安全地获取指向自身的、与原始 shared_ptr 共享引用计数的另一个 shared_ptr

为什么不能直接 new 一个 shared_ptr(this)?

直接写 std::shared_ptr(this) 是危险的:它会创建一个**新的控制块**,和原来管理该对象的 shared_ptr 互不感知。结果就是同一对象被两个独立的引用计数器管理,析构两次或提前释放,导致未定义行为(崩溃、内存错误)。

必须继承 enable_shared_from_this

要使用 shared_from_this(),类必须公有继承 std::enable_shared_from_this

  • 这个基类提供了一个弱引用(weak_ptr)用于内部记录对象是否已被 shared_ptr 持有;
  • 它本身不管理生命周期,只协助派生类安全生成共享指针;
  • 继承后,shared_from_this() 才能正确返回和原始 shared_ptr 共享控制块的实例。

只能在对象已被 shared_ptr 管理后调用

shared_from_this() 不是万能钥匙 —— 它要求当前对象**必须已经由至少一个 std::shared_ptr 拥有**,否则抛出 std::bad_weak_ptr 异常。

常见错误场景:

  • 在构造函数里调用(此时外部 shared_ptr 还没创建完成);
  • 对象是栈上分配或裸指针 new 出来的,从未交给 shared_ptr 管理;
  • 原始 shared_ptr 已销毁,但对象还在(比如通过 this 指针访问到已释放内存)。

典型用途:回调、异步操作、自我持有

最常见于需要把 this 安全传递给异步任务或回调函数的场景,避免悬挂指针或重复释放:

  • 网络库中,连接对象在收到数据后启动异步读取,需确保回调执行时对象仍存活;
  • 定时器回调中捕获 shared_from_this(),保证定时器触发时对象没被销毁;
  • 观察者模式中,被观察对象需向观察者传递自身智能指针,而非裸指针。

不复杂但容易忽略:继承、先由 shared_ptr 构造、再调用 —— 三者缺一不可。


# 回调函数  #   # c++  # 异步任务  # 为什么  # red  # 成员函数  # 构造函数  # 指针  # 继承  # 公有继承  # 对象  # this  # 异步  # 回调  # 已被  # 已由  # 还没  # 还在  # 两次  # 能在  # 而非  # 它会  # 创建一个 


相关文章: 北京网站制作的公司有哪些,北京白云观官方网站?  如何在Windows服务器上快速搭建网站?  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  如何通过多用户协作模板快速搭建高效企业网站?  教学网站制作软件,学习*后期制作的网站有哪些?  建站VPS配置与SEO优化指南:关键词排名提升策略  制作营销网站公司,淘特是干什么用的?  高端云建站费用究竟需要多少预算?  哈尔滨网站建设策划,哈尔滨电工证查询网站?  如何彻底删除建站之星生成的Banner?  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  如何基于PHP生成高效IDC网络公司建站源码?  ,柠檬视频怎样兑换vip?  建站之星伪静态规则如何正确配置?  如何通过cPanel快速搭建网站?  太平洋网站制作公司,网络用语太平洋是什么意思?  如何快速打造个性化非模板自助建站?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  建站之星各版本价格是多少?  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  制作门户网站的参考文献在哪,小说网站怎么建立?  建站之星后台管理:高效配置与模板优化提升用户体验  如何在云虚拟主机上快速搭建个人网站?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  如何选择可靠的免备案建站服务器?  如何快速搭建支持数据库操作的智能建站平台?  建站之星如何通过成品分离优化网站效率?  Swift中swift中的switch 语句  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  高防服务器租用首荐平台,企业级优惠套餐快速部署  建站之星安装后如何自定义网站颜色与字体?  如何快速查询网站的真实建站时间?  建站ABC备案流程中有哪些关键注意事项?  如何在阿里云域名上完成建站全流程?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  大型企业网站制作流程,做网站需要注册公司吗?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  宝塔建站教程:一键部署配置流程与SEO优化实战指南  如何通过WDCP绑定主域名及创建子域名站点?  实惠建站价格推荐:2025年高性价比自助建站套餐解析  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  如何快速建站并高效导出源代码?  建站之星价格显示格式升级,你的预算足够吗?  建站VPS推荐:2025年高性能服务器配置指南  如何在IIS中新建站点并配置端口与物理路径?  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  建站之星×万网:智能建站系统+自助建站平台一键生成  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一) 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。