用于将weak_ptr应用于unique_ptr的内容

Use for applying weak_ptr to contents of unique_ptr

本文关键字:ptr unique 应用于 用于 weak      更新时间:2023-10-16

我试图理解 c++11 附带的unique_ptrshared_ptrweak_ptr

我听说weak_ptr 的对于缓存、中断循环等事情会很好。我听说他们和shared_ptrs合作得很好.

但在这方面,shared_ptrsunique_ptrs有什么区别?为什么weak_ptr只能与一个一起使用,而不能与另一个一起使用?为什么我不想对其他人拥有的东西有一个弱引用?

技术上讲,weak_ptr是一种挂在一组管理某些共享对象的shared_ptr的引用计数器的方法。当最后一个shared_ptr被销毁时,对象将被销毁,但只要有weak_ptr,它的引用计数器就会继续存在。因此,通过任何仍然存在的weak_ptr您可以检查对象是否仍然存在或已被销毁。

如果它仍然存在,则可以从weak_ptr获取允许您引用对象的shared_ptr

这样做的主要用途是打破循环。

特别是,对象可以包含一个weak_ptr,该保留其自己的引用计数器,这允许您从对象本身获取对对象的shared_ptr。也就是说,一个shared_ptr,它使用与此对象的其他shared_ptr相同的引用计数器。这就是enable_shared_from_this的工作方式。

unique_ptr没有任何引用计数器,因此保留该不存在的引用计数器是没有意义的。

弱指针的主要点是你可以尝试使指针变强,那就是拥有:

auto strongPtr = weakPtr.lock();
if (strongPtr)
{
    // still existed, now have another reference to the resource
}
else
{
    // didn't still exist
}

注意第一条路径:使弱指针更强需要我们获得对象的所有权

这就是为什么它对unique_ptr没有意义的原因:使弱指针变强的唯一方法是从其他地方获取资源,对于unique_ptr来说,这意味着将其留在其他地方带有意外的空指针。 shared_ptr获得通行证,因为接受它真的意味着分享它。

我也是 C++11 的新手,所以如果有人知道得更好,我将不胜感激任何更正。

我认为没有太多理由,否则,你会使用shared_ptr,因为它会破坏unique_ptr的全部目的。unique_ptr具有隐含的语义,即它可以完全控制它指向的对象。