std::weak_ptr的核心作用是打破shared_ptr的循环引用并安全观察对象存续状态;它不参与引用计数,通过lock()临时升级为shared_ptr访问对象,或用expired()判断是否已销毁。
std::weak_ptr 的核心作用是打破 shared_ptr 的循环引用,同时安全地观察一个由 shared_ptr 管理的对象是否还存在。 它不参与对象的引用计数,因此不会延长对象生命周期,但能临时“升级”为 shared_ptr 来访问对象(前提是对象还没被销毁)。
当两个对象互相用 shared_ptr 持有对方时,它们的引用计数永远 ≥1,导致析构无法触发,内存泄漏。
例如:
把其中一端(通常是“从属关系”或“反向引用”)换成 weak_ptr:
除了破循环,weak_ptr 还适合这些情况:
建或跳过weak_ptr 本身不能直接解引用(没有 operator-> 或 operator*),必须先 lock() 成 shared_ptr 才能安全访问。这其实是它的保护机制——强制你面对对象可能已不存在的事实。
基本上就这些。不复杂,但容易忽略。