美文网首页
c++11智能指针(三)weak_ptr

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

作者: _gentle | 来源:发表于2018-07-17 12:11 被阅读0次
  • 弱引用指针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;
}

相关文章

  • C++11智能指针

    [C++11]智能指针 C++11包括了三种智能指针: shared_ptr weak_ptr unique_pt...

  • C++智能指针作为成员变量

    C++11为我们提供了shared_ptr、unique_ptr和weak_ptr这三种智能指针帮助我们更方便安全...

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

    弱引用指针weak_ptr是用来监视shared_ptr的,不会使引用计数加1或减1.它作为一个旁观者来监视sha...

  • c++智能指针用法

    智能指针是什么 智能指针是c++中有四个智能指针:auto_ptr、shared_ptr、weak_ptr、uni...

  • 再说智能指针

    一 STL的智能指针及使用 STL中智能指针有std::shared_ptr std::weak_ptr std:...

  • C++11智能指针(weak_ptr)

    weak_ptr是为了配合shared_ptr而引入的一种智能指针,因为它不具有普通指针的行为,没有重载opera...

  • C++11智能指针

    智能指针 unique_ptr shared_ptr weak_ptr 在C98中,智能指针通过一个模...

  • 1 - 智能指针

    https://www.nowcoder.com/discuss/418992 智能指针的实现,weak_ptr为...

  • C++ 智能指针

    C++智能指针[https://zhuanlan.zhihu.com/p/54078587] C++11中智能指针...

  • 现代 C++:一文读懂智能指针

    智能指针 C++11 引入了 3 个智能指针类型: std::unique_ptr :独占资源所有权的指针。...

网友评论

      本文标题:c++11智能指针(三)weak_ptr

      本文链接:https://www.haomeiwen.com/subject/pzswpftx.html