代码之家  ›  专栏  ›  技术社区  ›  keith

一旦std::weak_ptr上的锁返回了null ptr,它还能再次成为非null吗?

  •  8
  • keith  · 技术社区  · 7 年前

    如果你把门锁上 std::weak_ptr

        class foo {};
    
        auto s = std::make_shared<foo>();
    
        std::weak_ptr<foo> w{ s };
    
        s = nullptr;
    
        s.reset(new foo());
    
        auto l = w.lock(); // try to get previous foo
    
        std::cout << "locked: " << (l != nullptr) << std::endl;
    

    输出:

    locked: 0
    

    一旦锁返回 nullptr ,是否存在它可以返回非null的条件,或者它实际上是死的?

    我的测试程序建议,一旦最初分配的对象的引用计数为零,则为否, weak_ptr 将始终返回null ptr。

    2 回复  |  直到 7 年前
        1
  •  9
  •   Bartek Banachewicz    7 年前

    是否存在它可以返回非null的条件,或者它实际上是死的?

    lock expired

    expired() ? shared_ptr<T>() : shared_ptr<T>(*this)
    

    然后,查看到期条件:

    相当于 use_count() == 0 . 托管对象的析构函数可能尚未调用,但该对象的销毁即将发生(或可能已经发生)。

    不管是哪种方式,都不可能有这样的具体结果 weak_ptr 要重新分配给另一个值。

        2
  •  4
  •   Howard Hinnant    7 年前
    #include <iostream>
    #include <memory>
    
    int
    main()
    {
        using namespace std;
        shared_ptr<int> p(new int{3});
        weak_ptr<int> w = p;
        p = nullptr;
        auto l = w.lock();
        if (l == nullptr)
            cout << "l = nullptr\n";
        else
            cout << "l = " << *l << '\n';
        p.reset(new int{4});
        w = p;
        l = w.lock();
        if (l == nullptr)
            cout << "l = nullptr\n";
        else
            cout << "l = " << *l << '\n';
    }
    

    便携式输出:

    l = nullptr
    l = 4
    

    所以是的,如果 weak_ptr shared_ptr ,它可以“死而复生”

    也许你不是这个意思。但是它 你问的。