引用自C++ Primer $12.1.6:
weak_ptr
(表12.5)是一个智能指针,它不控制指向的对象的生命周期。相反,weak_ptr
指向由shared_ptr
管理的对象。将weak_ptr
绑定到shared_ptr
不会改变该shared_ptr
的引用计数。一旦指向该对象的最后一个shared_ptr
消失,该对象本身将被删除。即使有weak_ptr
指向它,该对象也将被删除,因此称为weak_ptr
,它捕捉到一个“弱”地共享其对象的想法。
然而,我读过一篇文章说:
使用make_shared更加高效。shared_ptr的实现必须在所有引用给定对象的shared_ptr和weak_ptr之间共享控制块中维护管理信息。特别是,该管理信息不仅需要包括一个而是两个引用计数: 1. “强引用”计数以跟踪当前保持对象存活的shared_ptr数量。当最后一个强引用消失时,共享对象被销毁(并可能被释放)。 2. “弱引用”计数以跟踪当前观察对象的weak_ptr数量。当最后一个弱引用消失时,共享管理控制块被销毁和释放(如果尚未释放,则共享对象被释放)。据我所知,由make_shared创建的shared_ptr与这些引用计数位于同一控制块中。因此,只有当最后一个weak_ptr过期时,对象才会被释放。
- Is the Primer wrong? Because
weak_ptr
will actually affects the lifetime of that object. - Why does the
shared_ptr
need to track its weak refs?The weak_ptr can tell if the object exists by checking the strong refs in control blocks,so I think the control block does not need to track the weak refs. Just for curiosity,what does the control block created by
shared_ptr
look like?Is it something like:template<typename T> class control_block { T object; size_t strong_refs; size_t weak_refs; void incre(); void decre(); //other member functions... }; //And in shared_ptr: template<typename T> class shared_ptr { control_block<T> block;//Is it like this?So that the object and refs are in the same block? //member functions... };
指向对象
,当最后一个 shared_ptr 被移除时将被删除;以及控制块对象
,它包含了引用计数,当最后一个指向它的 managed 指针被删除时(包括 shared 和 weak ptrs),该对象也会被删除。 - PeterTdelete ptr
通过调用指向对象的析构函数来销毁该对象,如果有的话,这将结束对象的生命周期,然后调用operator delete(),它可以针对对象类型进行特定处理,默认情况下,它会释放为对象分配的堆内存。 - Maarten Hilferink