w.use_count()...所有与weak_ptr指向同一对象的shared_ptr的数量 w.expired()...weak_ptr的生命期,指向对象还存在就返回true w.lock()...生命期未结束,则返回一个shared_ptr,指向同样的对象。否则返回一个指向null的shared_ptr #include<iostream> #include<memory> using std::cout; using std::endl; i...
如果原始的 shared_ptr 已经被释放,lock() 返回一个空的 shared_ptr。 判断是否有效:可以使用 expired() 函数来检查 weak_ptr 是否已经失效,即所观察的 shared_ptr 是否已经被释放。 解决循环引用问题:由于 weak_ptr 不增加引用计数,可以用于解决两个或多个对象之间的循环引用问题,避免内存泄漏。 示例代码: 代码...
int main() { std::weak_ptr<int> wp0; std::cout << "wp0.expired() == " << std::boolalpha << wp0.expired() << std::endl; std::shared_ptr<int> sp1(new int(5)); std::weak_ptr<int> wp1(sp1); std::cout << "*wp1.lock() == " << *wp1.lock() << std::endl; ...
它的成员函数expired()就是判断指向的对象是否存活。 针对循环引用问题# classMonster{//尽管父子可以互相访问,但是彼此都是独立的个体,无论是谁都不应该拥有另一个人的所有权。std::weak_ptr<Monster> m_father;//所以都把shared_ptr换成了weak_ptrstd::weak_ptr<Monster> m_son;//同上public:voidsetFather(...
bool expired() const; shared_ptr<T> lock() const; }; } 能够看到。boost::weak_ptr必须从一个boost::share_ptr或还有一个boost::weak_ptr转换而来,这也说明,进行该对象的内存管理的是那个强引用的boost::share_ptr。boost::weak_ptr仅仅是提供了对管理对象的一个訪问手段。
boost::weak_ptr除了对所管理对象的基本訪问功能(通过get()函数)外,还有两个经常使用的功能函数:expired()用于检測所管理的对象是否已经释放;lock()用于获取所管理的对象的强引用指针。 通过boost::weak_ptr来打破循环引用 因为弱引用不更改引用计数,类似普通指针,仅仅要把循环引用的一方使用弱引用,就可以解除循环引...
查看weak_ptr的代码时发现,它主要有lock、swap、reset、expired、operator=、use_count几个函数,与shared_ptr相比多了lock、expired函数,但是却少了get函数,甚至连operator*和operator->都没有,可用的函数数量少的可怜,下面通过一些例子来了解一下weak_ptr的具体用法。
1.使用weak_ptr的成员函数use_count()可以观测资源的引用计数,另一个成员函数expired()的功能等价于use_count()==0,但更快,表示被观测的资源(也就是shared_ptr的管理的资源)已经不复存在。2.weak_ptr可以使用一个非常重要的成员函数lock()从被观测的shared_ptr获得一个可用的shared_ptr对象, ...
如果expired()为true返回一个空shared_ptr,否则返回一个指向弱引用指针指向的对象的shared_ptr。 应用 笔者曾经写过一篇 Python 弱引用的文章,不久之后应该也会发出来。里面有一个弱引用相关的例子。这里就不再写了,写一下其他的。 首先就是弱引用可以防止shared_ptr之间的循环引用导致内存无法释放。
std::weak_ptr提供了一种方式来持有对对象的弱引用,不会增加对象的引用计数。当与std::shared_ptr一起使用时,你可以通过std::weak_ptr安全地访问对象,而不会导致循环引用。当std::shared_ptr指向的对象被删除时,所有相关的std::weak_ptr对象都会变得空无,你可以通过调用expired()函数来检测这一点。