请解释 C++ 中 weak_ptr 的工作机制是怎样的,以及它在什么场景下会被使用?
考察说明
考察对 C++ 智能指针,尤其是 weak_ptr 内部机制和适用场景的理解。
回答思路
- 【回答框架 1】weak_ptr 是一种不增加引用计数的智能指针,用于配合 shared_ptr 解决循环引用问题。它指向由 shared_ptr 管理的对象,但不拥有该对象,因此不会影响对象的生命周期。
- 【回答框架 2】weak_ptr 的核心机制是通过控制块(control block)中的弱引用计数(weak count)来跟踪指向该对象的 weak_ptr 数量。当 shared_ptr 的强引用计数降为零时,对象会被销毁,但控制块仍会保留,直到弱引用计数也为零,才会释放控制块。
- 【回答框架 3】weak_ptr 不能直接解引用,必须通过 lock() 方法尝试获取一个 shared_ptr。如果对象仍然存活,lock() 会返回一个有效的 shared_ptr 并增加强引用计数;如果对象已被销毁,则返回一个空的 shared_ptr。
- 【回答框架 4】典型使用场景包括:打破 shared_ptr 的循环引用(如双向链表中的节点互相持有 shared_ptr),缓存系统中缓存对象但允许过期销毁,以及观察者模式中避免观察者持有被观察者的强引用导致无法释放。
- 【关键点 1】weak_ptr 不增加引用计数,不拥有对象。
- 【关键点 2】weak_ptr 通过控制块中的弱引用计数管理生命周期,且不能直接访问对象。
- 【关键点 3】使用 lock() 获取 shared_ptr 并检查对象是否存活。
- 【关键点 4】主要用于解决循环引用和实现缓存或观察者模式。
- 【易错点 1】不要将 weak_ptr 直接当作普通指针使用,必须先调用 lock()。
- 【易错点 2】lock() 返回的 shared_ptr 可能为空,使用时需要判空。
- 【易错点 3】weak_ptr 不能直接管理动态分配的内存,它只能从 shared_ptr 构造或赋值。