std::enable_shared_from_this 模板类的作用是什么?
我们以Connection类的shared智能指针为例说明,std::enable_shared_from_this<Connection>
是一个标准库模板类,它的作用是让一个类的对象能够安全地生成指向自身的 std::shared_ptr
,即使该对象最初是通过普通指针或其他方式创建的。
作用
- 安全生成
std::shared_ptr
:当一个对象已经被std::shared_ptr
管理时,调用shared_from_this()
方法可以生成一个新的std::shared_ptr
,而不会创建新的引用计数。 - 避免重复管理:如果直接用
std::shared_ptr
包装一个已经被std::shared_ptr
管理的对象,会导致引用计数不一致,可能引发未定义行为。
底层原理
- 内部弱引用:
std::enable_shared_from_this
内部维护了一个std::weak_ptr
,指向当前对象。当std::shared_ptr
管理该对象时,这个弱引用会被初始化。 - shared_from_this():调用
shared_from_this()
时,std::weak_ptr
会被提升为std::shared_ptr
,从而安全地返回一个共享指针。 - 绑定生命周期:只有当对象被
std::shared_ptr
管理时,shared_from_this()
才能正常工作。如果对象未被std::shared_ptr
管理,调用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() {
auto obj = std::make_shared<MyClass>();
auto sharedObj = obj->getShared();
std::cout << "Use count: " << sharedObj.use_count() << std::endl; // 输出 2
return 0;
}
注意事项
- 必须确保对象是通过
std::shared_ptr
创建的,否则调用shared_from_this()
会导致未定义行为。 - 适用于需要在类内部生成
std::shared_ptr
的场景,例如回调函数或异步操作中需要延长对象生命周期的情况。