std::weak_ptr
是 C++ 标准库中提供的一个智能指针,用于解决 std::shared_ptr
之间循环引用的问题,从而避免内存泄漏。它提供了一种非拥有的、弱引用的方式指向由 std::shared_ptr
管理的对象。
特点
- 非拥有指针:
std::weak_ptr
不增加对象的引用计数,因此不会影响对象的生命周期。 - 解决循环引用:当两个或多个
std::shared_ptr
之间存在循环引用时,会导致对象无法被正确释放。使用std::weak_ptr
可以打破这种循环引用. - 过期检查:
std::weak_ptr
可以检查其指向的对象是否仍然存在。如果对象已经被释放,则weak_ptr
被认为是过期的.
成员函数
expired()
:返回一个布尔值,指示weak_ptr
是否过期。如果其指向的对象已经被删除,则返回true
.lock()
:返回一个指向对象的std::shared_ptr
。如果weak_ptr
已经过期,则返回一个空的shared_ptr
.use_count()
:返回指向对象的shared_ptr
的数量。如果weak_ptr
已经过期,则返回0
.
使用场景
- 打破循环引用:在对象之间存在循环引用的情况下,使用
weak_ptr
可以避免内存泄漏. - 缓存和观察者模式:在需要观察一个对象但不希望延长其生命周期时,可以使用
weak_ptr
。 - 延迟绑定:当需要在对象生命周期的某个阶段获取
shared_ptr
,但又不希望立即增加引用计数时,可以使用weak_ptr
。
示例
#include <iostream>
#include <memory>
class B;
class A : public std::enable_shared_from_this<A> {
public:
std::weak_ptr<B> b_ptr;
void print() {
std::cout << "A is printing" << std::endl;
}
};
class B : public std::enable_shared_from_this<B> {
public:
std::weak_ptr<A> a_ptr;
void print() {
std::cout << "B is printing" << std::endl;
}
};
int main() {
auto a = std::make_shared<A>();
auto b = std::make_shared<B>();
a->b_ptr = b;
b->a_ptr = a;
// 使用 weak_ptr 获取 shared_ptr
auto a_shared = a->b_ptr.lock();
if (a_shared) {
a_shared->print();
}
// a 和 b 的生命周期结束,不会导致内存泄漏
return 0;
}