• C++之std::enable_shared_from_this实例(一百九十八)


    简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

    优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

    人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

    更多原创,欢迎关注:Android系统攻城狮

    欢迎关注Android系统攻城狮

    1.前言

    本篇目的:C++之std::enable_shared_from_this实例

    std::enable_shared_from_this 是一个模板类,在 C++ 标准库的 头文件中定义。它提供了一种方便的方式来在类中获取指向自身的 std::shared_ptr

    std::enable_shared_from_this 主要用于解决在一个对象需要将自身的所有权共享给多个 std::shared_ptr 的情况。它的作用可以总结如下:

    1. 获取共享指针:通过继承 std::enable_shared_from_this,可以在类内部使用 shared_from_this() 成员函数来获取指向当前对象的 std::shared_ptr

    2. 避免裸指针问题:使用 std::enable_shared_from_this 可以解决裸指针(raw pointer)转换为 std::shared_ptr 的问题。如果一个对象直接从裸指针创建而不是通过 std::shared_ptr,那么调用 shared_from_this() 将导致 undefined behavior。而继承 std::enable_shared_from_this 可以确保对象只能通过 std::shared_ptr 创建,并且可以正确地共享所有权。

    3. 安全地共享所有权:当多个 std::shared_ptr 指向同一对象时,它们共享对该对象的所有权。这种方式可以确保在所有 std::shared_ptr 都析构之后,对象才会被正确地销毁。如果不通过 std::enable_shared_from_this 使用 shared_from_this(),在获取指向自身的 std::shared_ptr 时可能会导致引用计数错误或对象的早期销毁。

    请注意,为了正确使用 std::enable_shared_from_this,必须遵循以下几点:

    • 类必须继承自 std::enable_shared_from_this
    • 对象的生命周期必须由 std::shared_ptr 管理,不能使用裸指针。
    • 获取 shared_from_this() 的调用必须发生在对象被 std::shared_ptr 管理之后。

    std::enable_shared_from_this 提供了一种安全和方便的方式来获取指向自身的 std::shared_ptr,有效地解决了共享所有权的问题。

    2.实例

    #include 
    #include 
    
    class Test : public std::enable_shared_from_this<Test> {
    public:
      std::shared_ptr<Test> getShared() {
        return shared_from_this();
      }
    };
    
    int main() {
      std::shared_ptr<Test> objPtr = std::make_shared<Test>();
      std::shared_ptr<Test> sharedPtr = objPtr->getShared();
    
      //使用objPtr.get()和sharedPtr.get()来获取指针的原始地址.
      printf("objPtr = %p, sharedPtr = %p\n",objPtr.get(),sharedPtr.get());
      if(objPtr == sharedPtr){
        printf("objPtr == objPtr \n");
      }
    
      return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
  • 相关阅读:
    第二章 软件测试开发工程师
    (附源码)spring boot校园拼车微信小程序 毕业设计 091617
    [解题报告] CSDN竞赛第五期
    Java自学注意细节快速成长
    独立站源码建站和模板建站如何选择?
    AntDesign - UI -vue 列表表单验证,多条数据验证,正则验证,正则提示
    Linux中DNS的分离解析和自动分配
    vue2以ElementUI为例构建notify便捷精美提示
    拖拽页面元素+flip动画的案例
    基于STM32单片机的天然气与温湿度检测报警系统设计
  • 原文地址:https://blog.csdn.net/u010164190/article/details/132834833