shared_from_this

1. 核心痛点:为什么要用它?

问题场景: 当我们需要在类的成员函数内部 获取当前对象的 shared_ptr(即"把我自己交给别人管理")时。

错误做法: 直接使用 this 指针创建 shared_ptr

复制代码
// ❌ 绝对禁止!
std::shared_ptr<T> sp(this);
  • 后果: 导致 Double Free(重复释放)
  • 原因: 这样会创建一个新的控制块 。导致两个独立的 shared_ptr 管理同一块内存,引用计数互不通气,最终分别析构时都会尝试 delete 对象。

正确做法: 使用 shared_from_this()

  • 作用: 它查找并返回已存在的控制块,确保引用计数正确增加,而不是新建控制块

2. 标准用法 (代码模板)

使用时需满足两个语法条件:

  1. 类必须公有继承 (public)std::enable_shared_from_this<T>

  2. 对象必须由 shared_ptr 管理。

    #include <memory>

    class Worker : public std::enable_shared_from_this<Worker> { // 1. 继承
    public:
    void joinWorkGroup() {
    // 2. 获取自己的 shared_ptr
    std::shared_ptr<Worker> self = shared_from_this();

    复制代码
     // 业务逻辑...

    }
    };

    int main() {
    // 3. 必须使用 shared_ptr 创建对象
    auto w = std::make_shared<Worker>();
    w->joinWorkGroup();
    return 0;
    }


3. 底层原理 (面试考点)

enable_shared_from_this 是如何工作的?

  1. 内部成员: 该类内部隐藏了一个成员变量 mutable std::weak_ptr<T> weak_this;
  2. 延迟初始化:
    • 这个 weak_this不在构造函数中初始化。
    • 它是在外部第一次 创建 shared_ptr<T>(如 make_shared)时,由 shared_ptr 的构造函数检测并初始化的。
  1. 调用机制:
    • shared_from_this() 本质上就是执行 return weak_this.lock();
    • 它利用内部保存的弱引用,升级为一个新的强引用返回。

4. 三大"死亡陷阱" (易错点)

❌ 陷阱一:在构造函数中调用

  • 现象: 抛出 std::bad_weak_ptr 异常,程序崩溃。
  • 原因: 构造函数执行时,对象刚刚建立,外部的 shared_ptr 还没有机会初始化内部的 weak_this。此时 weak_ptr 是空的。
  • 解决: 使用"二段式构造"(先构造,再调用 init 函数),或者在其他成员函数中使用。

❌ 陷阱二:对象不是 shared_ptr 管理的

  • 场景: 对象在 上,或者通过 new 出来的裸指针

    Worker w;
    w.joinWorkGroup(); // 崩溃!

  • 原因: 没有外部 shared_ptr 介入,内部的 weak_this 永远不会被初始化,一直是空的。

❌ 陷阱三:私有继承 (Private Inheritance)

  • 场景: class Worker : std::enable_shared_from_this<Worker> (默认为 private)。
  • 原因: shared_ptr 的构造函数无法访问基类的成员,导致无法初始化 weak_this。必须显式写出 public

5. 一句话总结

shared_from_this****是为了解决"裸指针 this****变 shared_ptr****导致的多重释放"问题,其原理是利用内部隐藏的 weak_ptr****进行"借尸还魂"(共享控制块),但切记不可在构造函数中使用。

相关推荐
Larry_Yanan2 分钟前
Qt网络开发之基于 QWebEngine 实现简易内嵌浏览器
linux·开发语言·网络·c++·笔记·qt·学习
2401_831824969 分钟前
嵌入式C++驱动开发
开发语言·c++·算法
cui_ruicheng14 分钟前
C++数据结构进阶:哈希表实现
数据结构·c++·算法·哈希算法·散列表
li星野25 分钟前
[特殊字符] 模拟试卷一:C++核心与系统基础(90分钟)答案版
开发语言·c++·算法
呆瑜nuage31 分钟前
【复习系列】高频C/C++库函数手写实现指南与自定义类型的理解指南
c语言·c++·面试
li星野39 分钟前
C++面试真题分享20260320
java·c++·面试
Irissgwe40 分钟前
c++特殊类设计
java·开发语言·c++
小陈phd44 分钟前
多模态大模型学习笔记(二十一)—— 基于 Scaling Law方法 的大模型训练算力估算与 GPU 资源配置
笔记·深度学习·学习·自然语言处理·transformer
丝斯20111 小时前
AI学习笔记整理(75)——Python学习4
人工智能·笔记·学习
ID_180079054731 小时前
小红书笔记详情API深度解析:数据获取与应用实践
笔记