本文主要是介绍智能指针三剑客: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();
这篇关于智能指针三剑客:weak_ptr的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!