首页/新闻资讯/正文详情

enable_shared_from_this:类内部安全拿到 shared_ptr

发布时间:2026/9/24 17:44:52 来源:云帆数科 栏目:资讯中心
enable_shared_from_this:类内部安全拿到 shared_ptr
在类的成员函数里,有时需要把「指向自己的shared_ptr」交给别人——把自己注册进容器、挂到回调里、塞进观察者列表。最危险的写法是直接std::shared_ptrT(this):它编译通过、看着能用,实则埋下double free(重复释放)的雷。这篇把雷挖出来,并给出正确解法std::enable_shared_from_this(启用共享自引用,enable shared-from-this)。1. 引子:直接 shared_ptr(this) 造出第二个控制块this是个裸指针。从它再构造一个shared_ptr,库根本不知道「这个对象早就被别的shared_ptr管着」——它会新建一个独立的控制块。两个控制块都以为自己独占这个对象,析构时各delete一次,同一个对象就被释放了两遍:// 反例片段(无 main(),不参与编译校验):两个控制块,同一个对象#includememorystructFoo{~Foo(){/* 清理逻辑 */}};voidbad(std::shared_ptrFooowner){std::shared_ptrFooself(owner.get());// 反例,不要这么写:从裸指针新建了第二个控制块// owner 和 self 各有各的控制块、各算各的计数,// 退出时两个控制块都会 delete 同一个 Foo - double free}不用等到运行,编译器就看出不对劲了。GCC 13 在-O2下的真实警告(节选,去掉了头文件路径):warning: 'void operator delete(void*, std::size_t)' called on pointer 'unknown' with nonzero offset 16 [-Wfree-nonheap-object]根因就是这张图:错误:两个控制块(double free 的根源) a ── [控制块#1: 强=1] ┐ ├── [同一个对象 Foo] b ── [控制块#2: 强=1] ┘ (退出时两个控制块各 delete 一次 - 崩溃) 正确:一个控制块(enable_shared_from_this) a ── [控制块: 强=1, 弱=1] ── [对象 Foo] ↑ shared_from_this() 返回的是同一控制块上的别名, 只把强计数 +1,绝不新建控制块官方文档:std::shared_ptr 的构造函数(含从裸指针构造)— cppreference2. 正确解法:继承 enable_shared_from_this让类继承std::enable_shared_from_thisT,内部用shared_from_this()拿到的就是和原shared_ptr共享同一个控制块的指针:// esft_ok.cpp — 编译: g++ -std=c++17 -Wall -O2 esft_ok.cpp -o esft_ok#includeiostream#includememoryclassNode:publicstd::enable_shared_from_thisNode{public:voidregister_self(){conststd::shared_ptrNodeself=shared_from_this();// 安全:共享同一控制块std::cout"use_count = "self.use_count()'\n';}~Node

相关推荐

Python教程-Python中的基本命令 | 魔术命令
Python教程-Python中的基本命令 | 魔术命令

关于在教程里面提到的那些基本命令, 还有魔术命令的具体用法介绍。当它在1991年首次引入的时候, 普遍认为是属于自负风险的类型的一种语言。但是现在的情况已经改变了, 它已经成为了一种主导性的语言, 并且被用于数据科学领域、机器学习领域以及软件开发领域。大家都清楚, 它是… · 2026/9/24 17:44:39

Vercel造Agent框架eve!未来网站得为Bot优化
Vercel造Agent框架eve!未来网站得为Bot优化

这意味着这个事物正在发生一种变化, 这种变化的方向是成为Agent。在最近我阅读了一篇相关的采访文章, 在仔细观看与阅读之后, 我的脑海里始终都在反复盘旋着这样的一句话, 它让我难以忘怀。> " are a new type of . They are not as as web ."说出这句话的那个人叫… · 2026/9/24 17:44:39

万象棋谱-王者万象棋wiki百科:85 英雄全阵营、机制冷知识与流派克制一查便知
万象棋谱-王者万象棋wiki百科:85 英雄全阵营、机制冷知识与流派克制一查便知

《王者万象棋》9 月 10 日全平台上线后,最多的搜索就是「王者万象棋wiki」「王者万象棋图鉴」——85 名英雄、6 大阵营、78 件装备、254 张天赋、99 张效果牌,再加上拍卖、觉醒、词条联动这些新机制,光靠游戏内说明根本记不住。这篇文章就把 … · 2026/9/24 17:44:39

电子合同建筑装修场景测评:分包到班组,哪类合同最该先签
电子合同建筑装修场景测评:分包到班组,哪类合同最该先签

一个装修公司在工地现场跟班组签劳务协议,用的是打印好的纸,签完塞进文件夹带回项目部。三个月后文件夹找不到了,班组来要结算,双方对当初约定的单价各执一词。 建筑装修行业的合同管理有个天然劣势:签合同的地方在工地… · 2026/9/24 18:15:48

PyMuPDF PDF 文件压缩实战:深入解析 save() 压缩参数与最佳实践
PyMuPDF PDF 文件压缩实战:深入解析 save() 压缩参数与最佳实践

图像处理 【免费下载链接】PyMuPDF PyMuPDF is a high performance Python library for data extraction, analysis, conversion & manipulation of PDF (and other) documents. 项目地址: https://gitcode.com/gh_mirrors/py/PyMuPDF 点击查看 免费下载 PyMuP… · 2026/9/24 18:15:48

Xcode 自定义指令:教会 Copilot 你的编码习惯
Xcode 自定义指令:教会 Copilot 你的编码习惯

Xcode 自定义指令:教会 Copilot 你的编码习惯 【免费下载链接】CopilotForXcode AI coding assistant for Xcode 项目地址: https://gitcode.com/GitHub_Trending/cop/CopilotForXcode 你一定有过这种体验:刚让 Copilot 写了个网络请求函数&#… · 2026/9/24 18:15:42

Logistics | 第三方物流的药品追溯实施
Logistics | 第三方物流的药品追溯实施

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 18:15:42

C#图像切换动画引擎:PPT级特效的GDI+实现
C#图像切换动画引擎:PPT级特效的GDI+实现

简介:这是一份面向C#图像动画开发者的PPT风格幻灯片切换特效算法实现工程,适用于UI动效设计、多媒体课件开发及WinForm界面美化等场景。资源完整实现了30种图像切换动画算法,涵盖压缩反转、中心闭幕、随机分块、螺线内旋、三色淡入、对角滑动… · 2026/9/24 18:15:35

DQN交通信号控制实战:解决相位饥饿与绿波失效
DQN交通信号控制实战:解决相位饥饿与绿波失效

简介:本资源是一个基于Python与SUMO仿真的交通信号灯智能调控高分毕设项目,面向计算机、人工智能、自动化及交通工程等专业的本科生与研究生,解决城市交叉口信号配时优化这一典型控制问题。项目采用深度Q网络(DQN)强化… · 2026/9/24 18:15:35

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码