enable_shared_from_this的作用

C++ 中,std::enable_shared_from_this类模板和shared_from_this成员函数主要用于在一个类的成员函数中安全地获取指向自身的std::shared_ptr。它们的作用更多是为了确保资源正确管理。

当一个对象被多个std::shared_ptr管理时,如果在对象内部的成员函数中直接创建新的std::shared_ptr指向自身(也就是this),可能会导致多个独立的引用计数,从而无法正确管理对象的生命周期。而使用shared_from_this可以确保所有指向该对象的std::shared_ptr共享同一个引用计数,从而正确管理对象的生命周期。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <memory>

class MyClass : public std::enable_shared_from_this<MyClass> {
public:
void print() {
std::shared_ptr<MyClass> ptr = shared_from_this();
std::cout << "Use count: " << ptr.use_count() << std::endl;
}
};

int main() {
std::shared_ptr<MyClass> obj = std::make_shared<MyClass>();
obj->print();
return 0;
}

print函数中使用shared_from_this获取指向自身的std::shared_ptr,确保了与外部创建的std::shared_ptr共享同一个引用计数。

如果在对象内部的成员函数中直接返回一个指向自身的普通指针,当外部的std::shared_ptr被销毁后,这个普通指针就会变成悬空指针。而使用shared_from_this可以避免这种情况,因为它返回的std::shared_ptr会在引用计数为零时自动释放对象所占用的内存。例如这里不使用enable_shared_from_thisshared_from_this,则对象会多次释放,导致程序出错。

代码及其执行结果可参见:这里