std::weak_ptr.lock
时间: 2023-07-28 13:07:24 浏览: 173
浅析Boost智能指针:scoped_ptr shared_ptr weak_ptr
`std::weak_ptr` 是 C++11 引入的智能指针,它用于解决 `std::shared_ptr` 的循环引用问题。`std::weak_ptr` 指向 `std::shared_ptr` 管理的对象,但是不会增加引用计数。因此,即使 `std::shared_ptr` 已经释放了管理的对象,`std::weak_ptr` 仍然可以保持指向该对象的引用,并且可以通过 `lock()` 方法获取一个指向该对象的 `std::shared_ptr`。
`std::weak_ptr.lock()` 方法的作用是获取一个指向 `std::weak_ptr` 所指向的对象的 `std::shared_ptr`。如果 `std::weak_ptr` 已经过期(即所指向的对象已经被释放),则返回一个空的 `std::shared_ptr`。使用 `std::weak_ptr.lock()` 方法需要注意,因为它返回的 `std::shared_ptr` 可能为空,所以在使用之前需要进行检查,以避免访问空指针。
示例代码如下:
```c++
#include <memory>
#include <iostream>
int main() {
std::shared_ptr<int> sp = std::make_shared<int>(42);
std::weak_ptr<int> wp = sp;
std::shared_ptr<int> sp2 = wp.lock();
if (sp2) {
std::cout << "sp2: " << *sp2 << std::endl;
} else {
std::cout << "wp is expired." << std::endl;
}
sp.reset();
sp2.reset();
sp2 = wp.lock();
if (sp2) {
std::cout << "sp2: " << *sp2 << std::endl;
} else {
std::cout << "wp is expired." << std::endl;
}
return 0;
}
```
输出结果为:
```
sp2: 42
wp is expired.
```
在示例代码中,首先创建了一个 `std::shared_ptr` 对象 `sp`,然后创建了一个 `std::weak_ptr` 对象 `wp`,并将其指向 `sp` 所管理的对象。接着使用 `wp.lock()` 方法获取一个指向该对象的 `std::shared_ptr`,并将其赋值给 `sp2`。由于 `wp` 所指向的对象还未被释放,因此 `sp2` 不为空,输出结果为 `sp2: 42`。然后通过 `sp.reset()` 将 `sp` 置为空,此时 `sp` 不再管理对象,同时 `wp` 也过期了。然后再次调用 `wp.lock()` 方法,此时 `wp` 已经过期,无法获取指向对象的 `std::shared_ptr`,因此输出结果为 `wp is expired.`。
阅读全文