当前位置: 首页 > 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 的场景,例如回调函数或异步操作中需要延长对象生命周期的情况。
http://www.dtcms.com/a/131639.html

相关文章:

  • 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的用法与实现
  • 第一阶段补充知识
  • 【信息系统项目管理师】高分论文:论信息系统项目的范围管理(投资信息化全流程管理项目)
  • TestHubo安装及入门指南
  • MuJoCo 机械臂关节路径规划+轨迹优化+末端轨迹可视化(附代码)
  • 计算机网络 - 三次握手相关问题
  • 【CUDA】ubuntu环境下安装cuda
  • 为 docker 拉取镜像配置代理
  • 【5G通信】通过RRC重配实现功率调整的可能性
  • 【Python内置函数的深度解析与应用】id
  • Dify - 整合Ollama + Xinference私有化部署Dify平台(01)