以下讨论中,不考虑使用了裸指针的情况。
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会失败。