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

  • 弱引用指针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;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容