MST

星途 面试题库

面试题:C++中std::weak_ptr如何监测对象生命周期

请简述C++中std::weak_ptr监测对象生命周期的原理,并给出一个简单示例代码说明std::weak_ptr如何判断所指向对象是否已被销毁。
27.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

std::weak_ptr监测对象生命周期的原理

std::weak_ptr 是C++ 智能指针家族中的一员,它用于解决 std::shared_ptr 循环引用问题,并监测对象的生命周期。原理如下:

  1. 不控制对象生命周期std::weak_ptr 不增加对象的引用计数,它只是观察由 std::shared_ptr 管理的对象。
  2. std::shared_ptr 关联std::weak_ptr 可以从一个 std::shared_ptr 或者另一个 std::weak_ptr 构造而来,从而与一个对象关联。
  3. 检查对象是否存在:通过调用 std::weak_ptrexpired() 成员函数来判断所观察的对象是否已经被销毁。如果对象已被销毁,expired() 返回 true;否则返回 false。另外,lock() 函数会尝试获取一个指向对象的 std::shared_ptr,如果对象已被销毁,lock() 返回一个空的 std::shared_ptr

示例代码

#include <iostream>
#include <memory>

int main() {
    // 创建一个 std::shared_ptr 管理的对象
    std::shared_ptr<int> sharedPtr = std::make_shared<int>(42);

    // 使用 std::shared_ptr 创建一个 std::weak_ptr
    std::weak_ptr<int> weakPtr = sharedPtr;

    // 检查对象是否存在
    if (!weakPtr.expired()) {
        std::cout << "对象存在,尝试获取 std::shared_ptr" << std::endl;
        std::shared_ptr<int> lockedPtr = weakPtr.lock();
        if (lockedPtr) {
            std::cout << "获取成功,对象的值为: " << *lockedPtr << std::endl;
        }
    } else {
        std::cout << "对象已被销毁" << std::endl;
    }

    // 释放 std::shared_ptr
    sharedPtr.reset();

    // 再次检查对象是否存在
    if (!weakPtr.expired()) {
        std::cout << "对象存在,尝试获取 std::shared_ptr" << std::endl;
        std::shared_ptr<int> lockedPtr = weakPtr.lock();
        if (lockedPtr) {
            std::cout << "获取成功,对象的值为: " << *lockedPtr << std::endl;
        }
    } else {
        std::cout << "对象已被销毁" << std::endl;
    }

    return 0;
}

在上述代码中,首先创建了一个 std::shared_ptr 管理的 int 类型对象,并基于此创建了一个 std::weak_ptr。通过 expired() 函数和 lock() 函数来判断和获取对象。当 std::shared_ptr 释放对象后,再次使用 std::weak_ptr 检查对象状态。