weak_ptr

weak_ptr#

weak_ptr 是一种用于解决 shared_ptr 相互引用时产生死锁问题的智能指针。如果有两个 shared_ptr 相互引用,那么这两个 shared_ptr 指针的引用计数永远不会下降为 0,资源永远不会释放。 weak_ptr 是对对象的一种弱引用,它不会增加对象的 use_countweak_ptrshared_ptr 可以相互转化, shared_ptr 可以直接赋值给 weak_ptrweak_ptr 也可以通过调用 lock 函数来获得 shared_ptr

weak_ptr 指针通常不单独使用,只能和 shared_ptr 类型指针搭配使用。将一个 weak_ptr 绑定到一个 shared_ptr 不会改变 shared_ptr 的引用计数。一旦最后一个指向对象的 shared_ptr 被销毁,对象就会被释放。即使有 weak_ptr 指向对象,对象也还是会被释放。

weak_ptr 并没有重载 operator->operator * 操作符,因此不可直接通过 weak_ptr 使用对象,典型的用法是调用其 lock 函数来获得 shared_ptr 示例,进而访问原始对象。

为了理解 std::shared_from_this() 方法,我们可以参考官方给的示例:

#include <iostream>
#include <memory>

struct Foo : public std::enable_shared_from_this<Foo>
{
    Foo() { std::cout << "Foo::Foo\n"; }
    ~Foo() { std::cout << "Foo::~Foo\n"; }
    std::shared_ptr<Foo> getFoo() { return shared_from_this(); }
};

int main()
{
    Foo *f = new Foo;
    std::shared_ptr<Foo> pf1;

    {
        std::shared_ptr<Foo> pf2(f); // pf2 指向了 Foo 对象
        pf1 = pf2->getFoo();         // pf1 获得了与 pf2 共享的指针,也指向了 Foo 对象
    }

    std::cout << "pf2 is gone\n";
}