3.weak_ptr--弱引用的智能指针
用来监视shared_ptr,不管理shared_ptr内部的指针,没有重载操作符*和->,不会增加引用计数
基本用法:
1.通过use_count()获得当前观测资源的引用计数
2.通过expired()判断观测的资源是否已经被释放
3.通过lock()方法获取所检测的shared_ptr
std::weak_ptr<int> wp; void f() { if(wp.expired()) { cout << "wp is expired"<<endl; } else { auto ap = wp.lock(); cout << ap << ":" << *ap<<endl; } } int main(int argc, char *argv[]) { { auto sp = std::make_shared<int>(10); wp=sp; f(); } f(); system("pause"); return 0; }
运行结果:
使用弱引用指针返回this指针,解决循环引用问题:
- 使用弱引用指针返回this指针
不能直接将this指针返回为shared_ptr,需要通过派生类std:enable_shared_from_this,可以通过shared_from_this()方法返回智能指针,其中起作用的就是weak_ptr。在类std::enable_shared_form_this中有一个weak_ptr,这个weak_ptr是用来观测this智能指针的,调用std::shred_from_this()时会调用这个weak_ptr的lock()方法,把观测到的shared_ptr返回。
需要注意的一点是,获取自身智能指针的函数仅在shared_ptr<T>的构造函数被调用之后才能使用,因为weak_ptr只有通过shared_ptr才能构造。
- 解决循环引用问题
智能指针的循环引用会导致内存泄漏,可以通过weak_ptr解决这个问题。
struct A; struct B; std::weak_ptr<A> awp; std::weak_ptr<B> bwp; struct A { std::shared_ptr<B> bptr; ~A() {cout << "A is deleted!"<<endl;} }; struct B { std::shared_ptr<A> aptr; ~B() {cout << "B is deleted!"<<endl;} }; void testPtr() { { std::shared_ptr<A> ap(new A); std::shared_ptr<B> bp(new B); ap->bptr =bp; bp->aptr = ap; awp = ap; printf("ap.usecount = %d\n",awp.use_count());//输出ap.usecount =2 bwp = bp; printf("bp.usecount = %d\n",bwp.use_count());//输出ap.usecount =2 } printf("ap.usecount = %d\n",awp.use_count());//输出ap.usecount =1 printf("bp.usecount = %d\n",bwp.use_count());//输出ap.usecount =1 }
把A或B中的shared_ptr改为weak_ptr,std::weak_ptr<B> bptr;或std::weak_ptr<A> aptr;
输出如果如下
参考:《深入应用C++11:代码优化与工程级应用》