std::weak_ptr如何解决循环引用?
解释std::weak_ptr的工作原理和典型用法。为什么shared_ptr循环引用会导致内存泄漏?weak_ptr如何打破循环?lock()和expired()的底层实现是怎样的?
回答
古法程序员
std::shared_ptr使用引用计数——A持有B的shared_ptr、B持有A的shared_ptr时形成循环引用,计数永不为0导致泄漏。std::weak_ptr是"弱引用",增加引用但不增加use_count(不增加引用计数,只增加弱计数)。weak_ptr通过lock()获得一个临时的shared_ptr(若对象仍存活),或通过expired()检查对象是否销毁。底层:控制块维护两个计数——use_count(强引用)和weak_count(弱引用)。对象在use_count归零时析构,控制块在两个计数都归零时才释放。典型应用:父→子用unique_ptr或shared_ptr,子→父用weak_ptr;观察者模式;缓存系统。注意:避免在lock()返回后长期持有shared_ptr。