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会失败。

  • 相关阅读:
    es6 数组的扩展
    面向对象的7大原则及其实例
    flex 布局
    一、创建vue
    箭头函数
    destructuring
    spreed&rest
    变量新声明之let、const
    jQuery之遍历索引相关方法
    jQuery之位置坐标图形相关方法
  • 原文地址:https://www.cnblogs.com/kohlrabi/p/9230769.html
Copyright © 2011-2022 走看看