weak_ptr通过lock()方法来获取一个指向shared_ptr的强引用,如果原来的shared_ptr已经被释放,lock()会返回一个空指针。 weak_ptr的原理是通过一个控制块(control block)来实现的。控制块包含了一个弱引用计数和一个指向被观测的shared_ptr的指针。当一个shared_ptr被创建时,会有一个相关联的控制块被创建。当没...
weak_ptr本身也是一个模板类,但是不能直接用它来定义一个智能指针的对象,只能配合shared_ptr来使用,可以将shared_ptr的对象赋值给weak_ptr,并且这样并不会改变引用计数的值。查看weak_ptr的代码时发现,它主要有lock、swap、reset、expired、operator=、use_count几个函数,与shared_ptr相比多了lock、expired函数,但是...
weak_ptr lock weak_ptr的lock()函数是用来获取一个指向其所管理的shared_ptr的shared_ptr对象的一个成员函数。该函数会检查weak_ptr是否过期(即其所管理的对象是否已经销毁),如果没有过期,则返回一个指向其所管理的对象的shared_ptr;如果已经过期,则返回一个空的shared_ptr。lock()函数可以防止weak_ptr所管理的...
可以通过lock来提升为shared_ptr(类型装换)。 通过一个示例简单认识一下 intmain() { shared_ptr<Person> s1 = make_shared<Person>();//weak_ptr是需要和shared_ptr一起来用的weak_ptr<Person>w1{ s1 };//结果都是1 计数器不会增加cout <<"s1->count="<< s1.use_count() <<endl; cout<<"w1-...
lock() 如果当前 weak_ptr 已经过期,则该函数会返回一个空的 shared_ptr 指针;反之,该函数返回一个和当前 weak_ptr 指向相同的 shared_ptr 指针。*/std::shared_ptr<SmartPointer> p = std::make_shared<SmartPointer>("test"); std::shared_ptr<SmartPointer>p1(p);/*并不影响shared_ptr的引用计数*/...
既然weak_ptr并不改变其所共享的shared_ptr实例的引用计数,那就可能存在weak_ptr指向的对象被释放掉这种情况。 这时,我们就不能使用weak_ptr直接访问对象。那么我们如何判断weak_ptr指向对象是否存在呢? C++中提供了lock函数来实现该功能。 如果对象存在,lock()函数返回一个指向共享对象的shared_ptr,否则返回一个空sh...
Alice->m_otherOne.lock()->m_name; // weak_ptr访问对象方式 1. 2. lock函数返回一个从weak_ptr构建的临时的shared_ptr,通过此shared_ptr我们可以访问对象。lock函数的调用含义相当于以下语句: expired() ? shared_ptr<T>() : shared_ptr<T>(*this) ...
weak_ptr不控制对象的生命期,但是它知道对象是否还活着。如果对象还活着,那么它可以提升为有效的shared_ptr(提升操作通过lock()函数获取所管理对象的强引用指针);如果对象已经死了,提升会失败,返回一个空的shared_ptr。 (2)循环引用问题: #include <iostream>#include<memory>usingnamespacestd;classParent;classChild...
std::weak_ptr<T>::lock std::shared_ptr<T>lock()constnoexcept; (C++11 起) 创建新的std::shared_ptr对象,它共享被管理对象的所有权。若无被管理对象,即*this为空,则返回亦为空的shared_ptr。 等效地返回expired()?shared_ptr<T>():shared_ptr<T>(*this),原子地执行。
如果weak_ptr所指的shared_pre引用计数为0,返回一个空的shared_ptr 否则,返回一个shared_ptr对象 代码语言:javascript 代码运行次数:0 复制 Cloud Studio代码运行 auto p=make_shared<int>(42);weak_ptr<int>wp(p);if(shared_ptr<int>np=wp.lock()){...//如果np不为空则执行if}else{}...