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

posted @ 2018-06-26 19:03  Droplet  阅读(324)  评论(0)    收藏  举报