如果最初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;
}
在将拥有指针的数量输出到控制台时,我们有一个值1
at,正如预期的那样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
的)