如果最初std::weak_ptr指向一个空指针std::shared_ptr:
std::shared_ptr<Ptr> ptr = nullptr;
std::weak_ptr<Ptr> weak(ptr);
但在那之后它ptr开始指向某个对象Ptr:
ptr = std::make_shared<Ptr>();
指针weak没有改变它的状态并且仍然保持expired?
weak.expired() == true?
因为下面的代码:
int main()
{
std::shared_ptr<Ptr> ptr = nullptr;
std::weak_ptr<Ptr> weak(ptr);
if (weak.expired())
{
std::cout << "shared is nullptr" << std::endl;
}
ptr = std::make_shared<Ptr>();
std::shared_ptr<Ptr> ptr1 = weak.lock();
std::cout << "counter must be 2. Actual: " << ptr.use_count() <<
std::endl;
return 0;
}
在将拥有指针的数量输出到控制台时,我们有一个值1at,正如预期的那样2。
事实证明,它仅显示仅在其创建时的std::weak_ptr最新信息?std::shared_ptr如果以后这个智能指针从非空变为存在,weak指针不会改变它的状态吗?
std::shared_ptr和都std::weak_ptr附加到这些智能指针之间共享的公共“状态”(“控制块”)。y 状态std::shared_ptr仅在指定对象出现时出现。Emptystd::shared_ptr不附加到任何状态,当 empty 分配给std::shared_ptr另一个智能指针(其他std::shared_ptr或std::weak_ptr)时,不会发生状态拆分。复制空智能指针时,它们保持为空并且完全相互独立。因此,是的,其他指针无法注意到
std::shared_ptr从最初为空状态到非空状态的转换。别人std::weak_ptr不能,别人std::shared_ptr也不能(这里没有具体std::weak_ptr的)