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

转载于:https://www.cnblogs.com/kohlrabi/p/9230769.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值