4

我试图理解c++11 中的unique_ptr,shared_ptr​​ 和。weak_ptr

我听说这weak_ptr对于缓存和中断循环等事情会很好。我听说他们与shared_ptrs.

shared_ptrs但是在这方面,和 和有什么区别unique_ptrs?为什么weak_ptrget 只能与一个一起使用而不与另一个一起使用?为什么我不想弱引用别人拥有的东西?

4

3 回答 3

7

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

如果它仍然存在,那么weak_ptr您可以从中获得一个shared_ptr可以让您引用该对象的对象。

它的主要用途是打破循环。

特别是,一个对象可以包含一个weak_ptr对它自己的引用计数器的持有,这允许你shared_ptr从对象本身获得一个对象。也就是说,a使用与该对象的其他 sshared_ptr相同的引用计数器。shared_ptr这是如何enable_shared_from_this工作的。

unique_ptr没有任何引用计数器,因此挂在那个不存在的引用计数器上是没有意义的。

于 2013-03-17T06:06:57.233 回答
4

弱指针的主要观点是您可以尝试使指针变强,即拥有:

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获得通行证,因为接受它真的意味着分享它。

于 2013-03-17T05:03:53.653 回答
2

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

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

于 2013-03-17T05:02:28.377 回答