- 弱引用指针weak_ptr是用来监视shared_ptr的,不会使引用计数加1或减1.它作为一个旁观者来监视shared_ptr管理的资源是否存在,也可以用来返回this指针或解决循环引用问题。
- 它不共享指针,没有重载*和->, 因此不能操作资源
观察资源的常见用法
#include<iostream>
#include<memory>
int main(){
std::shared_ptr<int> sp = std::make_shared<int>(10);
std::weak_ptr<int> wp(sp);
std::cout << wp.use_count() << std::endl;//获得当前的引用计数
//观察资源是否已经被释放
if(wp.expired()) {
std::cout << "expired" << std::endl;
} else {
auto spt = wp.lock(); // 获得管理的指针
std::cout << *spt << std::endl;
}
}
返回this指针
- 其实enable_shared_from_this 就是构造了一个weak_ptr。shared_from_this() 就是通过weak_ptr的lock()方法返回的智能指针。当对象的引用计数减为0时,对象就被析构,因此不会出现重复析构的问题。
解决循环引用问题
如果B中的aptr为shared_ptr,那么将导致ap和bp的引用计数均为2。如果把A和B中的一个引用对方的指针改为weak_ptr,则可以避免这个问题,因为它不会增加shared_ptr的引用计数。
#include<iostream>
#include<memory>
struct A;
struct B;
struct A {
std::shared_ptr<B> bptr;
~A() {
std::cout << "A is delete" << std::endl;
}
};
struct B {
//std::shared_ptr<A> aptr;//导致内存泄漏
std::weak_ptr<A> aptr;
~B() {
std::cout << "B is delete " << std::endl;
}
};
int main(){
std::shared_ptr<A> ap(new A);
std::shared_ptr<B> bp(new B);
ap->bptr = bp;
bp->aptr = ap;
}