C++ enable_shared_from_this

简介: `std::enable_shared_from_this<>` 是 C++11 引入的模板类,用于安全地在类中创建 `std::shared_ptr` 实例。它解决了成员函数中直接创建 `std::shared_ptr` 导致的对象多次销毁和未定义行为问题。通过继承 `std::enable_shared_from_this<>` 并调用 `shared_from_this()` 方法,可以在类的成员函数中安全地获取当前对象的 `std::shared_ptr`。

C++(13) enable_shared_from_this

std::enable_shared_from_this<> 是 C++11 引入的一个模板类,用于在一个类中安全地创建 std::shared_ptr 实例。

std::enable_shared_from_this<> 的主要设计目的是解决在类的成员函数中安全地创建 std::shared_ptr 实例的问题。具体来说,它避免了以下两个常见问题:

多次销毁对象: 如果在类的成员函数中直接使用 std::shared_ptr(this) 创建一个新的 std::shared_ptr,会导致创建多个独立的控制块,从而导致对象被多次销毁。

未定义行为: 如果在没有 std::shared_ptr 管理当前对象的情况下调用 shared_from_this(),会导致未定义行为。

使用方法

基本用法

  1. 继承 std::enable_shared_from_this<>:
    要让一个类能够安全地创建 std::shared_ptr,需要让该类继承 std::enable_shared_from_this<>。
    ```c++
    class MyClass : public std::enable_shared_from_this {
    public:
    void doSomething() {
     std::shared_ptr<MyClass> self = shared_from_this();
     // 使用 self 进行操作
    
    }
    };

2. 创建 std::shared_ptr 实例: 在类的外部创建 std::shared_ptr 实例,并调用成员函数。

```c++
int main() {
    std::shared_ptr<MyClass> obj = std::make_shared<MyClass>();
    obj->doSomething();
    return 0;
}

高级用法

  1. 避免循环引用: 使用 std::weak_ptr 避免循环引用问题。
    ```c++
    class MyClass : public std::enable_shared_from_this {
    public:
    void setFriend(std::shared_ptr friendObj) {

    friend_ = friendObj;
    

    }

    void doSomething() {

    if (auto sharedFriend = friend_.lock()) {
        // 使用 sharedFriend 进行操作
    }
    

    }

private:
std::weakptr friend;
};


2. 在异步操作中使用: 在异步操作中,确保对象的生命周期由 std::shared_ptr 管理。
```c++
class AsyncTask : public std::enable_shared_from_this<AsyncTask> {
public:
    void start() {
        auto self = shared_from_this();
        std::thread([self]() {
            // 异步操作
        }).detach();
    }
};

注意事项

必须在已经存在的 std::shared_ptr 管理下使用 shared_from_this():

如果直接调用 shared_from_this() 而不存在任何 std::shared_ptr 管理当前对象,会导致未定义行为。

避免循环引用: 使用 std::shared_ptr 时要注意避免循环引用,否则会导致内存泄漏。可以使用 std::weak_ptr 来解决循环引用问题。

实现原理

std::enable_shared_from_this<> 的实现原理是通过一个私有成员变量(通常是一个 std::weak_ptr)来存储当前对象的控制块。

当调用 shared_from_this() 时,

它会检查这个 std::weak_ptr 是否有效,并返回一个 std::shared_ptr 实例

相关文章
|
6月前
|
消息中间件 Kubernetes NoSQL
c++ std::enable_shared_from_this作用
c++ std::enable_shared_from_this作用
|
5天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
28 4
|
6天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
23 4
|
29天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
26 4
|
29天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
22 4
|
29天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
19 1
|
1月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
1月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)
|
1月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
53 1
|
1月前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
19 1