std::enable_shared_from_this
是 C++ 标准库中的一个模板类,位于 <memory>
头文件中。它提供了一种方式,允许一个对象(通常是由 std::shared_ptr
管理的)生成一个指向自身的 std::shared_ptr
,即使对象自身是通过裸指针(raw pointer)传递给 std::shared_ptr
构造函数的。这种操作通常在对象需要将自身作为参数传递给回调函数或异步操作时非常有用。
std::enable_shared_from_this
的使用通常遵循以下步骤:
- 将要使用
shared_from_this()
的类继承自std::enable_shared_from_this
。 - 在需要获取指向自身的
shared_ptr
的地方,调用shared_from_this()
函数。
这样做的好处是,即使对象自身是通过裸指针传递给 std::shared_ptr
构造函数的,也可以安全地获取指向自身的 shared_ptr
,避免了潜在的内存泄漏和未定义行为。
以下是一个简单的示例代码,演示了 std::enable_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() {
std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();
std::shared_ptr<MyClass> ptr2 = ptr1->getShared();
if (ptr1 == ptr2) {
std::cout << "Both shared_ptr point to the same object." << std::endl;
} else {
std::cout << "Unexpected behavior!" << std::endl;
}
return 0;
}
在这个示例中,MyClass
继承自 std::enable_shared_from_this
,并提供了一个成员函数 getShared()
,用于获取指向自身的 shared_ptr
。在 main()
函数中,通过 make_shared
创建了一个 MyClass
对象,并获取了两个指向该对象的 shared_ptr
,它们使用 getShared()
函数获取了指向同一对象的 shared_ptr
,然后进行了比较,确认它们确实指向同一个对象。