weak_ptr是C++智能指针中的一种。它用于解决共享所有权的问题,并且可以避免因循环引用而导致的内存泄漏。

使用weak_ptr探知对象是否存活的方法如下:

  1. 创建weak_ptr对象:通过shared_ptr创建一个weak_ptr对象,将其绑定到所管理的对象上。
std::shared_ptr<int> sharedPtr = std::make_shared<int>(42);
std::weak_ptr<int> weakPtr(sharedPtr);

  1. 检查对象是否有效:可以使用expired()成员函数来检查weak_ptr所指向的对象是否仍然有效。如果返回值为true,则表示对象已经被释放,不再可用;如果返回值为false,则表示对象仍然有效。
if (weakPtr.expired()) {
    // 对象已经被释放
} else {
    // 对象仍然有效
}
    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

    在另一本书中则是有这样一个demo

    使用lock来获取一个shared_ptr对象,然后判断是否为空。