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共享同一个引用计数,从而正确管理对象的生命周期。

例如:

#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,则对象会多次释放,导致程序出错。

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