智能指针三剑客:weak_ptr

目录

weak_ptr概述

 weak_ptr对象

weak_ptr简单操作


weak_ptr概述

weak_ptr并不是独立的智能指针,weak_ptr主要被用来辅助share_ptr工作。由于weak_ptr的引用计数并不与指向对象的生命周期相关联,weak_ptr可以安全的访问一个由shared_ptr所管理的对象并不改变指向对象的内容。所以使用weak_ptr访问对象不需要担心意外延长其生命周期。除此之外,weak_ptr一般还被用于解决shared_ptr产生的循环问题。

 weak_ptr对象

weak_ptr的生存依赖于shared_ptr,我们可以使用shared_ptr对象初始化weak_ptr对象,也可以用weak_ptr对象给weak_ptr对象初始化。

shared_ptr<int> ps=weak_ptr<int>(666);
weak_ptr<int> pw(ps);
weak_ptr<int> pw2=pw;

weak_ptr 的创建会引起弱引用计数的增加。与shared_ptr指向产生的强引用计数不同,弱引用计数的增加并不会影响管理对象的生命周期。在调试时,shared_ptr对象和weak_ptr对象都可以用来观察强引用和弱引用的计数。

weak_ptr对象并不管理指向内存的生命周期会造成weak_ptr对象有可能指向一片已经被释放了的内存空间。因此weak_ptr对象并不能直接的访问指向的对象,而是通过使用lock()函数间接访问以确保其安全性。lock的功能是检查weak_ptr指向的对象是否存在,若存在返回指向该对象的shared_ptr指针。若对象已经被释放,返回空的shared_ptr对象。

shared_ptr<int> ps=make_shared<int>(666);
weak_ptr<int> pw(ps);
shared_ptr<int> ps2=pw.lock();
if(pw2==nullptr)
{
    cout<<"delete over"<<endl;
}
else
{
    cout<<"strong live"<<endl;
}

weak_ptr简单操作

use_count():返回与该weak_ptr对象指向相同的强指针数量,也就是shared_ptr的引用计数。

shared_ptr<int> ps(new int(666));
auto ps2(ps);
weak_ptr<int> pw(ps);
cout<<pw.use_count()<<endl;//2

expired():检查指向对象是否过期,如果指向对象内存已经被释放了,返回true,否则返回false。

shared_ptr<int> ps(new int(999));
weak_ptr<int> pw(ps);
ps.reset();
if(pw.expired())
{
    cout<<"指向对象已经过期"<<endl;
}

reset():weak_ptr对象也有reset功能。将该weak_ptr对象置空,强引用计数不变,弱引用计数减一。

shared_ptr<int> ps(new int(666));
weak_ptr<int> pw(ps);
pw.reset();

猜你喜欢

转载自blog.csdn.net/2301_78933228/article/details/137777902