首页 > 解决方案 > 一旦 std::weak_ptr 上的锁返回 nullptr,它还能再次为非 null 吗?

问题描述

如果您锁定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,是否存在可以返回非空的条件,或者它实际上已经死了?

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

标签: c++c++11

解决方案


是否存在可以返回非空值的所有条件,或者它实际上已经死了?

好吧,那时它“几乎”死了。以与此等效的方式lock调用:expired

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

然后,查看到期条件:

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

无论哪种方式,都不可能将特定weak_ptr值重新分配给另一个值。


推荐阅读