weak_ptr 是否总是在 shared_ptr 重置后过期?

Does weak_ptr is always expired after shared_ptr reset?

我找到了类似的 question 但我的示例略有不同。

这是一个非常简单的例子:

int main()
{
   auto sp = std::make_shared<T>();
   std::weak_ptr<T> wp = sp;
   sp.reset();
   assert(wp.expired());
}

是否保证在上述情况下 weak_ptr 在 shared_ptr 重置后总是过期?

是的,expired() 等同于 use_count()==0use_count() 定义为返回共享托管对象的 shared_ptr 个实例的数量。一旦你调用 sp.reset(),那个数字就是零。

是的,这是有保证的。打电话

sp.reset();

相当于

shared_ptr().swap(*this)

这意味着sp现在回到了默认构造状态。如果我们查看标准中的 use_count,我们有

Returns: the number of shared_ptr objects, *this included, that share ownership with *this, or 0 when *this is empty.

并且因为它是空的,所以 use_count0 并且 expriedexpried

一样

Checks whether the managed object has already been deleted. Equivalent to use_count() == 0.