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

时间:2017-06-09 13:59:32

标签: c++ c++11 shared-ptr weak-ptr

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

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

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

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

2 个答案:

答案 0 :(得分:4)

是的,这是有保证的。调用

sp.reset();

相当于

shared_ptr().swap(*this)

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

  

返回: shared_ptr对象的数量,*this包含的内容,与*this共享所有权,或0 *this } 为空

由于它为空,use_count0expried为真expried

  

检查托管对象是否已被删除。相当于use_count() == 0

答案 1 :(得分:3)

是的,expired()相当于use_count()==0use_count()定义为返回共享托管对象的shared_ptr个实例的数量。致电sp.reset()后该号码为零。