新闻详情

新闻详情

首页 / 资讯中心 / 详情

enable_shared_from_this:类内部安全拿到 shared_ptr

发布时间:2026/11/14 17:44:46来源:尧图网络
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
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/14 3:51:47

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/12 23:59:09

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/14 10:11:15

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/14 17:14:38

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/14 16:35:50

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/14 3:51:43

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉