weak_ptr 弱引用的实现

 

std::weak_ptr通过内部使用一个指向控制块(control block)的指针来实现。控制块是一个包含引用计数和其他相关信息的结构体,用于跟踪std::shared_ptr共享的对象。控制块通常由一个引用计数和一个指向堆上分配的对象的指针组成。

当你创建一个std::shared_ptr时,它会分配一个新的控制块,并将对象的指针存储在其中。然后,如果你使用std::weak_ptr创建一个弱引用,它会共享相同的控制块,但不会增加引用计数。控制块中的引用计数仅由std::shared_ptr维护。

当你需要访问通过std::weak_ptr观测的对象时,你可以使用std::weak_ptr的lock()函数。lock()函数会返回一个std::shared_ptr,它指向与std::weak_ptr共享相同对象的控制块。如果对象已被销毁,lock()函数将返回一个空的std::shared_ptr。

通过这种方式,std::weak_ptr可以知道它观测的对象是否仍然存在。它通过检查与之共享的控制块中的引用计数来确定对象是否有效。如果引用计数为0,表示对象已被销毁,std::weak_ptr将失效。否则,std::weak_ptr可以使用lock()函数获取一个有效的std::shared_ptr,并访问对象。