为什么用enable_shared_from_this,而不是显式地将 this 指针传递给 std::make_shared 函数
时间: 2024-04-17 07:24:11 浏览: 81
使用 `enable_shared_from_this` 主要是为了方便在对象内部获取指向自身的 `shared_ptr`,而不需要显式地将 `this` 指针传递给 `std::make_shared` 函数。
当一个类继承自 `std::enable_shared_from_this` 时,它会获得一个成员函数 `shared_from_this`,该函数可以返回一个指向当前对象的 `shared_ptr`。这个函数可以在类的成员函数内部调用,而无需传递 `this` 指针。
这种用法主要是为了解决在某些场景下,当一个对象自身已经被一个 `shared_ptr` 管理时,需要在类内部获取指向自身的 `shared_ptr` 的需求。如果不使用 `enable_shared_from_this`,则需要在每次创建对象时都显式地传递 `this` 指针给 `std::make_shared`,这样会增加代码的复杂性和出错的可能性。
需要注意的是,使用 `enable_shared_from_this` 需要满足以下条件:
1. 对象必须被 `shared_ptr` 管理,即不能使用裸指针或者 `unique_ptr` 管理对象;
2. 在获取 `shared_ptr` 的成员函数中调用 `shared_from_this`。
总之,使用 `enable_shared_from_this` 可以提供更方便和安全的方式来获取指向自身的 `shared_ptr`。
相关问题
class InputEventHandler final : public std::enable_shared_from_this<InputEventHandler>
`InputEventHandler` 类作为 `std::enable_shared_from_this<InputEventHandler>` 的派生类,意味着这个类支持智能指针的行为,特别是当实例化它的对象被 `std::shared_ptr<InputEventHandler>` 所管理时。`std::enable_shared_from_this` 的存在使得对象能够从自身内部获取到那个持有它的共享所有权的智能指针。
当你有一个 `InputEventHandler` 对象 `t` 被 `std::shared_ptr<InputEventHandler> pt` 指向时,可以通过调用 `t.shared_from_this()` 来创建一个新的 `std::shared_ptr<InputEventHandler>`,这个新指针同样拥有对 `t` 的所有权,并且它们之间是共享的。这意味着如果任何一个指针被销毁(即调用其 `reset()` 函数),另一个也会随之失效,以避免内存泄漏。
下面是一个简单的示例:
```cpp
class InputEventHandler final : public std::enable_shared_from_this<InputEventHandler>
{
public:
// 假设有一些处理输入的方法...
void handleInput() { ... }
// 使用 shared_from_this 创建新的共享智能指针
std::shared_ptr<InputEventHandler> getSelfSharedPtr() const {
return shared_from_this();
}
};
// 创建并使用shared_ptr
std::shared_ptr<InputEventHandler> eventHandler = std::make_shared<InputEventHandler>();
eventHandler->handleInput(); // 调用事件处理器
// 通过getSelfSharedPtr获取指向自身的共享智能指针
std::shared_ptr<InputEventHandler> selfPtr = eventHandler->getSelfSharedPtr();
```
c++11 基类不是单例继承std::enable_shared_from_this,子类是单例
在C++11中,如果你有一个基类不是使用`std::enable_shared_from_this`作为单例模式,而它的子类打算作为单例,那么你需要特别处理共享指针(如`std::shared_ptr`),因为`enable_shared_from_this`是为了让对象能够方便地从一个共享智能指针返回自身。
基类的情况可能像这样:
```cpp
class NonSingletonBase {
//...
};
```
子类想要作为单例的话,通常会这样做:
```cpp
class SingletonSubClass : private NonSingletonBase {
private:
static std::once_flag flag;
static std::shared_ptr<SingletonSubClass> instance;
protected:
SingletonSubClass() = default;
~SingletonSubClass() = default;
public:
static std::shared_ptr<SingletonSubClass>& getInstance() {
std::call_once(flag, []{
instance = std::make_shared<SingletonSubClass>();
});
return instance;
}
private:
// 防止直接实例化
SingletonSubClass(SingletonSubClass const&) = delete;
SingletonSubClass& operator=(SingletonSubClass const&) = delete;
};
```
在这里,`getInstance()`函数确保只创建一个实例,并通过`std::call_once`保证线程安全。
阅读全文