美文网首页
weak_ptr的使用场景

weak_ptr的使用场景

作者: zlcook | 来源:发表于2020-08-07 14:33 被阅读0次
  • weak_ptr只能从shared_ptr对象构建。
  • weak_ptr并不影响动态对象的生命周期,即其存在与否并不影响对象的引用计数器。当weak_ptr所指向的对象因为shared_ptr计数器为0而被释放后,那么weak_ptr的lock方法将返回空。
  • weak_ptr并没有重载operator->和operator *操作符,因此不可直接通过weak_ptr使用对象。
  • 提供了expired()与lock()成员函数,前者用于判断weak_ptr指向的对象是否已被销毁,后者返回其所指对象的shared_ptr智能指针(对象销毁时返回”空“shared_ptr),如果返回shared_ptr,那么计数器会加1.

使用场景

  • 1 当你想使用对象,但是并不管理对象,并且在需要时可以返回对象的shared_ptr时,则使用

    • 比如,一个A类有两个耗时的加载方法,想在里面线程池来指向,那么就需要穿一个线程池给这个类,但是并不想让A以shared_ptr成员变量来引用这个线程池,所以通过weak_ptr方式就很ok。
    1. 解决shared_ptr的循环引用问题
    • 下面代码存在循环引用问题:在这里的b和a的计数都是1,在这里当你进行析构的时候,析构一块空间,会去考虑先释放另外一块空间,然后释放另外一块空间,又要依赖于释放现在的这块空间,这样就会出现一个无限的循环,所以最终的结果是,谁都没有进行释放空间,这样就存在了内存泄漏的问题。
#include <iostream>
#include <memory>

class A;

class B{
   public:
   ~B() {
     std::cout << "B destory, a_ptr use_count:" << a_ptr.use_count() << "\n";
   }
   
   std::shared_ptr<A> a_ptr;
 };
 
class A{
public:
    ~A() {
        std::cout << "A destory, b_ptr use_count:" << b_ptr.use_count() << "\n";
    }
      
    std::shared_ptr<B> b_ptr;
};
 
int main()
{
    std::shared_ptr<A> a(new A());
     std::shared_ptr<B> b(new B());
     a->b_ptr=b;
     b->a_ptr=a;
    
     std::cout << "A:" << a.use_count() << "\n";
     std::cout << "B" << b.use_count() << "\n";
}
* 运行结果:
A:2
B:2
  • 解决方式,其中一方以weak_ptr方式管理对象。比如把A中对b的指针,使用weak_ptr就可以了。
class A{
public:
    ~A() {
        std::cout << "A destory, b_ptr use_count:" << b_ptr.use_count() << "\n";
    }
      
    std::weak_ptr<B> b_ptr;
};
 
* 运行结果:
A:2
B:1
B destory, a_ptr use_count:2
A destory, b_ptr use_count:0

相关文章

  • weak_ptr的使用场景

    weak_ptr只能从shared_ptr对象构建。 weak_ptr并不影响动态对象的生命周期,即其存在与否并不...

  • 再说智能指针

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

  • 1 - 智能指针

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

  • Android常见面试问题

    · AsyncTask使用场景? · HandlerThread使用场景? · IntentService使用场景...

  • 026 weak_ptr

    weak_ptr 是一种不控制所指向对象生存期的智能指针,它指向由一个 shared_ptr 管理的对象,将一个 ...

  • c++primer 14.30-14.42

    14.30定义常量版本的* -> 14.31因为StrBlobPtr的私有属性有一个weak_ptr,不需要考虑...

  • weak_ptr lock 理解

    创建新的 std::shared_ptr 对象,它共享被管理对象的所有权。若无被管理对象,即 *this 为空,则...

  • std::weak_ptr用法

    一、特性 std::weak_ptr并不是一种独立的智能指针,而是std::shared_ptr的一种扩充。std...

  • task7

    1.class 和 id 的使用场景? id的使用场景: id只能被使用一次,在页面分段等场景下可以使用。 cla...

  • [枯叶]场景设计(待续)

    场景设计1.场景应用加权 判断场景 时间维度首次使用/持续性使用 2.场景设计思路首先定义该场景需要达到的目标,再...

网友评论

      本文标题:weak_ptr的使用场景

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