c++11智能指针(三)weak_ptr

  • 弱引用指针weak_ptr是用来监视shared_ptr的,不会使引用计数加1或减1.它作为一个旁观者来监视shared_ptr管理的资源是否存在,也可以用来返回this指针或解决循环引用问题。
  • 它不共享指针,没有重载*和->, 因此不能操作资源

观察资源的常见用法

#include
#include


int main(){
    std::shared_ptr sp = std::make_shared(10);
    std::weak_ptr 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
#include
struct A;
struct B;
struct A {
    std::shared_ptr bptr;
    ~A() {
        std::cout << "A is delete" << std::endl;
    }
};
struct B {
    //std::shared_ptr aptr;//导致内存泄漏
    std::weak_ptr aptr;
    ~B() {
        std::cout << "B is delete " << std::endl;
    }
};
int main(){
    std::shared_ptr ap(new A);
    std::shared_ptr bp(new B);
    ap->bptr = bp;
    bp->aptr = ap;
}

你可能感兴趣的:(c++11智能指针(三)weak_ptr)