weak_ptr
是C++智能指针中的一种。它用于解决共享所有权的问题,并且可以避免因循环引用而导致的内存泄漏。
weak_ptr
本身并不承担对象的所有权,它指向由shared_ptr
管理的对象。与shared_ptr
不同,weak_ptr
并不会增加计数器来计算对象的引用次数。因此,当所有shared_ptr
释放后,即使还有相关的weak_ptr
存在,也无法访问对象。为了判断对象是否仍然存在,weak_ptr
提供了一个方法来检查其所指向的对象是否有效。
使用weak_ptr
探知对象是否存活的方法如下:
- 创建
weak_ptr
对象:通过shared_ptr
创建一个weak_ptr
对象,将其绑定到所管理的对象上。
std::shared_ptr<int> sharedPtr = std::make_shared<int>(42);
std::weak_ptr<int> weakPtr(sharedPtr);
在上述示例中,我们使用shared_ptr
管理一个整数对象,并通过weak_ptr
创建一个弱引用。
- 检查对象是否有效:可以使用
expired()
成员函数来检查weak_ptr
所指向的对象是否仍然有效。如果返回值为true
,则表示对象已经被释放,不再可用;如果返回值为false
,则表示对象仍然有效。
if (weakPtr.expired()) {
// 对象已经被释放
} else {
// 对象仍然有效
}
- 锁定
weak_ptr
:如果希望访问weak_ptr
所指向的对象,可以使用lock()
成员函数来获取一个指向对象的shared_ptr
。如果对象已经被释放,则返回一个空的shared_ptr
。
std::shared_ptr<int> sharedPtr = weakPtr.lock();
if (sharedPtr) {
// 通过 sharedPtr 访问对象
} else {
// 对象已经被释放
}
在上述示例中,我们通过lock()
函数尝试获取一个shared_ptr
来访问对象。如果对象已经被释放,则返回一个空的shared_ptr
,否则返回一个有效的shared_ptr
。
需要注意的是,由于weak_ptr
不会增加引用计数,因此不能直接使用weak_ptr
来访问对象。需要将其转换为shared_ptr
,以确保对象在使用期间不会被意外释放。
通过以上方法,我们可以使用weak_ptr
来探知对象是否存活,并避免悬空指针的风险。这在处理缓存、观察者模式等场景下特别有用。
下面是陈硕书中的demo