面试题答案
一键面试std::weak_ptr监测对象生命周期的原理
std::weak_ptr
是C++ 智能指针家族中的一员,它用于解决 std::shared_ptr
循环引用问题,并监测对象的生命周期。原理如下:
- 不控制对象生命周期:
std::weak_ptr
不增加对象的引用计数,它只是观察由std::shared_ptr
管理的对象。 - 与
std::shared_ptr
关联:std::weak_ptr
可以从一个std::shared_ptr
或者另一个std::weak_ptr
构造而来,从而与一个对象关联。 - 检查对象是否存在:通过调用
std::weak_ptr
的expired()
成员函数来判断所观察的对象是否已经被销毁。如果对象已被销毁,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
检查对象状态。