C++ 在共享\u ptr重置后,弱\u ptr是否总是过期?

C++ 在共享\u ptr重置后,弱\u ptr是否总是过期?,c++,c++11,shared-ptr,weak-ptr,C++,C++11,Shared Ptr,Weak Ptr,我发现了一个类似的例子,但我的例子略有不同 下面是一个非常简单的例子: int main() { auto sp = std::make_shared<T>(); std::weak_ptr<T> wp = sp; sp.reset(); assert(wp.expired()); } intmain() { 自动sp=std::使_共享(); std::弱ptr wp=sp; sp.reset(); 断言(wp.expired()); } 在

我发现了一个类似的例子,但我的例子略有不同

下面是一个非常简单的例子:

int main()
{
   auto sp = std::make_shared<T>();
   std::weak_ptr<T> wp = sp;
   sp.reset();
   assert(wp.expired());
}
intmain()
{
自动sp=std::使_共享();
std::弱ptr wp=sp;
sp.reset();
断言(wp.expired());
}

在上述情况下,是否保证在共享ptr重置后弱ptr始终过期

是,
expired()
相当于
use\u count()==0
use_count()
定义为返回共享托管对象的
shared_ptr
实例数。一旦调用
sp.reset()
该数字为零。

是的,
过期()
相当于
使用计数()==0
use_count()
定义为返回共享托管对象的
shared_ptr
实例数。调用sp.reset()后,该数字为零。

是,这是有保证的。召唤

sp.reset();
相当于

shared_ptr().swap(*this)
这意味着
sp
现在回到默认构造状态。如果我们查看
使用现有标准中的\u count

返回:与
*this
共享所有权的
共享\u ptr
对象(包括
*this
)的数量,或
*this
为空时的
0

由于它是空的,
use\u count
0
,而
expried
将作为

检查托管对象是否已被删除。等效于
使用_count()==0


是的,这是有保证的。召唤

sp.reset();
相当于

shared_ptr().swap(*this)
这意味着
sp
现在回到默认构造状态。如果我们查看
使用现有标准中的\u count

返回:与
*this
共享所有权的
共享\u ptr
对象(包括
*this
)的数量,或
*this
为空时的
0

由于它是空的,
use\u count
0
,而
expried
将作为

检查托管对象是否已被删除。等效于
使用_count()==0


@tobi303该问题询问当您使用同一对象重置
共享\u ptr
时会发生什么。这个问题问你在没有对象的情况下重置时会发生什么。@GuyRT哦,这当然是一个区别。忽略了…接近投票retracted@tobi303该问题询问当您使用同一对象重置
共享\u ptr
时会发生什么。这个问题问你在没有对象的情况下重置时会发生什么。@GuyRT哦,这当然是一个区别。忽略了…关闭投票撤回我不明白
wp
如何访问
sp
使用计数
方法。@ZoeCerver当您从
sp
创建
wp
时,
wp
会获得指向
sp
控制块的链接。这就是它如何判断它指向的指针是否有效的方法。那么交换它是否会改变变量或控制块指针的值?@zoecerver IIRC
sp
保持相同的控制块,但是,这些值被设置回默认状态。感谢您的帮助,并对所有问题表示抱歉:)但是在libc++中,控制块的默认状态是0(或nullptr),这意味着它将丢失对控制块的引用,对吗?另外(根据标准),swap“交换*this和r.的内容”(其中r.control_block==nullptr)。我不明白
wp
如何访问
sp
使用
方法。@zoecerver当您从
sp
创建
wp
时,
wp
会获得指向
sp
的控制块的链接。这就是它如何判断它指向的指针是否有效的方法。那么交换它是否会改变变量或控制块指针的值?@zoecerver IIRC
sp
保持相同的控制块,但是,这些值被设置回默认状态。感谢您的帮助,并对所有问题表示抱歉:)但是在libc++中,控制块的默认状态是0(或nullptr),这意味着它将丢失对控制块的引用,对吗?此外(根据标准),swap“交换*this和r.的内容”(其中r.control_block==nullptr)。