c++ - 一旦 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。
解决方案
是否存在可以返回非空值的所有条件,或者它实际上已经死了?
好吧,那时它“几乎”死了。以与此等效的方式lock
调用:expired
expired() ? shared_ptr<T>() : shared_ptr<T>(*this)
然后,查看到期条件:
相当于
use_count() == 0
。托管对象的析构函数可能尚未被调用,但该对象的销毁迫在眉睫(或可能已经发生)。
无论哪种方式,都不可能将特定weak_ptr
值重新分配给另一个值。
推荐阅读
- telepot - from tensorflow.lite.python.interpreter import Interpreter 防止 Telepot
- python - 如何使用 Python 抓取特定字段,如下面的 HTML 代码所示?
- git - 如何使用搜索关键字和排序获取 git 标签
- python - 'if statement' 删除所有不符合条件的行,我不想要那个
- javascript - 如何更改文本区域中的光标位置?
- sql - 没有关联表的多对多关系
- python - 电影推荐系统的 scikit learn 中的 fit_transform 错误
- docusignapi - DocuSign 我可以将哪些特殊字段添加到 Word 文档中以通过 API 使用
- c - 在 C 中读取控制台输出以进行 ping
- docker - Docker-compose:如何在不使用命名卷或多阶段构建的情况下在服务之间共享数据