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

2018-07-17  本文已影响0人  _gentle

观察资源的常见用法

#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指针

解决循环引用问题

如果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;
}
上一篇 下一篇

猜你喜欢

热点阅读