enable_shared_from_this用法
时间: 2023-06-12 11:02:09 浏览: 87
enable_shared_from_this是一个模板类,它提供了一个函数shared_from_this,用于获得一个指向当前对象的shared_ptr。它的用法是,在类定义中继承enable_shared_from_this,并在本类中保存一个weak_ptr指向自身,然后通过shared_from_this获取该对象的shared_ptr。使用shared_ptr管理对象的好处是,可以预防内存泄漏和空悬指针的问题。但是需要注意的是,对象必须通过shared_ptr创建,否则使用shared_from_this将会出现未定义行为。
相关问题
C++ std::enable_shared_from_this用法
`std::enable_shared_from_this` 是一个模板类,其目的是为了解决在一个对象中保存 shared_ptr 的问题。它是 C++11 引入的一个特性。
在使用 `std::shared_ptr` 时,我们往往需要在对象中保存一个 `std::shared_ptr` 的副本,这样才能确保对象在使用完毕后不会被提前销毁。但是这种方式会导致一些问题,比如我们无法防止用户直接使用裸指针来操作对象,从而导致对象被提前销毁等问题。
这时候,我们可以使用 `std::enable_shared_from_this` 来解决这些问题。具体而言,我们需要继承 `std::enable_shared_from_this`,然后在对象中使用 `shared_from_this()` 方法来获取一个指向当前对象的 `std::shared_ptr`。
下面是一个示例代码:
```c++
#include <iostream>
#include <memory>
class MyClass : public std::enable_shared_from_this<MyClass>
{
public:
std::shared_ptr<MyClass> get_shared_ptr()
{
return shared_from_this();
}
};
int main()
{
std::shared_ptr<MyClass> p(new MyClass);
std::shared_ptr<MyClass> q = p->get_shared_ptr();
std::cout << "p.use_count() = " << p.use_count() << std::endl;
std::cout << "q.use_count() = " << q.use_count() << std::endl;
return 0;
}
```
在这个示例中,我们定义了一个名为 `MyClass` 的类,并且继承了 `std::enable_shared_from_this`。然后,我们在类中定义了一个名为 `get_shared_ptr()` 的方法,该方法使用了 `shared_from_this()` 方法来获取一个指向当前对象的 `std::shared_ptr`。在 `main()` 函数中,我们先创建了一个 `std::shared_ptr` 对象 `p`,然后通过 `p` 调用 `get_shared_ptr()` 方法获取了一个指向同一个对象的 `std::shared_ptr` 对象 `q`。最后,我们输出了 `p` 和 `q` 的引用计数,可以看到它们的引用计数都是 2。
需要注意的是,在使用 `std::enable_shared_from_this` 时,我们需要确保对象已经被一个 `std::shared_ptr` 管理,否则使用 `shared_from_this()` 方法会导致程序崩溃。
为什么用enable_shared_from_this,而不是显式地将 this 指针传递给 std::make_shared 函数
使用 `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`。
阅读全文