用于将weak_ptr应用于unique_ptr的内容

时间:2013-03-17 04:55:54

标签: c++ memory-management boost memory-leaks c++11

我正在尝试了解c ++ 11中的unique_ptrshared_ptrweak_ptr

我听说weak_ptr对于缓存,打破周期等等都会很好。我听说他们与shared_ptrs合作得很好。

但就此而言,shared_ptrsunique_ptrs之间有什么区别?为什么weak_ptr只能与一个而不是另一个一起使用?为什么我不想对其他人拥有的东西进行弱引用?

3 个答案:

答案 0 :(得分:7)

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

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

这主要用于打破周期。

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

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

答案 1 :(得分:4)

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

auto strongPtr = weakPtr.lock();

if (strongPtr)
{
    // still existed, now have another reference to the resource
}
else
{
    // didn't still exist
}

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

这就是unique_ptr没有意义的原因:使弱指针强大的唯一方法是从其他地方获取资源,以及{{1}这意味着在其他地方留下一个意外的空指针。 unique_ptr获得通过,因为接受它真的意味着分享它。

答案 2 :(得分:2)

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

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