zoukankan      html  css  js  c++  java
  • std::weak_ptr

    以下讨论中,不考虑使用了裸指针的情况。

    std::weak_ptr的使用情景:

    1、对象相互引用。

    在相互引用的情况下,对象释放顺序不同时,造成的结果也是不同的。
    如下图所示(黑色箭头代表shared_ptr,红色箭头代表weak_ptr):

    a、ptr_1先离开作用域时,Object1不会被被释放,结果如下:

    b、ptr_2先离开作用域时,因为没有shared_ptr指向Object2,所以Object2会被释放,结果如下:

    2、指针的生存期比对象生存期长。

    贴一段mapboxgl中的代码

    std::shared_ptr<ThreadPool> sharedThreadPool() {
        static std::weak_ptr<ThreadPool> weak;
        auto pool = weak.lock();
        if (!pool) {
            weak = pool = std::make_shared<ThreadPool>(4);
        }
        return pool;
    }

    全局变量weak会一直存在。但其所指向的对象,在没有shared_ptr指向它时,会被释放掉。
    如果使用裸指针代替weak,则对象在创建后会一直存在。如果主动释放又有可能造成其他
    地方访问野指针。

    与QPointer的对比。

    QPointer作用于QObject及其子类的指针。QObject析构时,所有包含其指针的QPointer变为为clear。
    如果将shared_ptr看作QObject指针,则weak_ptr类似于QPointer。当所有shared_ptr出了作用域后,
    对象被释放,weak_ptr的check会失败。

  • 相关阅读:
    委托事件
    泛型
    栈和队列
    泛型
    枚举与位枚举
    数组 集合
    .NET Framework 简介
    三行代码 完美解决word标签文字替换 POI增强版 可插入图片
    Github国内镜像网站,解决Github访问的神器
    Eureka
  • 原文地址:https://www.cnblogs.com/kohlrabi/p/9230769.html
Copyright © 2011-2022 走看看