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 IIRCsp
保持相同的控制块,但是,这些值被设置回默认状态。感谢您的帮助,并对所有问题表示抱歉:)但是在libc++中,控制块的默认状态是0(或nullptr),这意味着它将丢失对控制块的引用,对吗?另外(根据标准),swap“交换*this和r.的内容”(其中r.control_block==nullptr)。我不明白wp
如何访问sp
的使用
方法。@zoecerver当您从sp
创建wp
时,wp
会获得指向sp
的控制块的链接。这就是它如何判断它指向的指针是否有效的方法。那么交换它是否会改变变量或控制块指针的值?@zoecerver IIRCsp
保持相同的控制块,但是,这些值被设置回默认状态。感谢您的帮助,并对所有问题表示抱歉:)但是在libc++中,控制块的默认状态是0(或nullptr),这意味着它将丢失对控制块的引用,对吗?此外(根据标准),swap“交换*this和r.的内容”(其中r.control_block==nullptr)。