当前位置: 首页 > news >正文

std::enable_shared_from_this 模板类的作用是什么?

我们以Connection类的shared智能指针为例说明,std::enable_shared_from_this<Connection> 是一个标准库模板类,它的作用是让一个类的对象能够安全地生成指向自身的 std::shared_ptr,即使该对象最初是通过普通指针或其他方式创建的。

作用

  1. 安全生成 std::shared_ptr:当一个对象已经被 std::shared_ptr 管理时,调用 shared_from_this() 方法可以生成一个新的 std::shared_ptr,而不会创建新的引用计数。
  2. 避免重复管理:如果直接用 std::shared_ptr 包装一个已经被 std::shared_ptr 管理的对象,会导致引用计数不一致,可能引发未定义行为。

底层原理

  1. 内部弱引用std::enable_shared_from_this 内部维护了一个 std::weak_ptr,指向当前对象。当 std::shared_ptr 管理该对象时,这个弱引用会被初始化。
  2. shared_from_this():调用 shared_from_this() 时,std::weak_ptr 会被提升为 std::shared_ptr,从而安全地返回一个共享指针。
  3. 绑定生命周期:只有当对象被 std::shared_ptr 管理时,shared_from_this() 才能正常工作。如果对象未被 std::shared_ptr 管理,调用 shared_from_this() 会导致未定义行为。

示例

#include <iostream>
#include <memory>

class MyClass : public std::enable_shared_from_this<MyClass> {
public:
    std::shared_ptr<MyClass> getShared() {
        return shared_from_this();
    }
};

int main() {
    auto obj = std::make_shared<MyClass>();
    auto sharedObj = obj->getShared();

    std::cout << "Use count: " << sharedObj.use_count() << std::endl; // 输出 2
    return 0;
}

注意事项

  • 必须确保对象是通过 std::shared_ptr 创建的,否则调用 shared_from_this() 会导致未定义行为。
  • 适用于需要在类内部生成 std::shared_ptr 的场景,例如回调函数或异步操作中需要延长对象生命周期的情况。

相关文章:

  • KEGG注释脚本kofam2kegg.py--脚本010
  • 小程序页面传值的多种方式
  • SQL语言
  • 力扣hot100_技巧_python版本
  • Multisim使用说明详尽版--(2025最新版)
  • 高效爬虫:一文掌握 Crawlee 的详细使用(web高效抓取和浏览器自动化库)
  • CS5346 - Interactivity in Visualization 可视化中的交互
  • Java 架构设计:从单体架构到微服务的转型之路
  • 大语言模型深度思考与交互增强
  • 策略模式随笔~
  • 适合单片机裸机环境的运行的软件定时器框架
  • Linux 下 Module 工具的介绍与使用
  • 深入解读:2024 可信数据空间建设及应用参考指南【附全文阅读】
  • Go 语言中的局部变量是分配在栈区还是堆区
  • 数据结构-限定性线性表 - 栈与队列
  • 在Mac上离线安装k3s
  • HarmonyOS:页面滚动时标题悬浮、背景渐变
  • 【微服务管理】深入理解 Gateway 网关:原理与实现
  • fbx/obj/glb/gltf/b3dm等通用格式批量转换成osgb
  • STL之priority_queue的用法与实现
  • “75后”袁达已任国家发改委秘书长
  • 中国银行副行长刘进任该行党委副书记
  • 西藏阿里地区日土县连发两次地震,分别为4.8级和3.8级
  • 五一期间上海景观照明开启重大活动模式,外滩不展演光影秀
  • 安阳一村支书微信群骂村民被警方行拘,辩称对方先“污蔑造谣”
  • 商务部:4月份以来的出口总体延续平稳增长态势