我正在尝试了解c ++ 11中的unique_ptr
,shared_ptr
和weak_ptr
。
我听说weak_ptr
对于缓存,打破周期等等都会很好。我听说他们与shared_ptrs
合作得很好。
但就此而言,shared_ptrs
和unique_ptrs
之间有什么区别?为什么weak_ptr
只能与一个而不是另一个一起使用?为什么我不想对其他人拥有的东西进行弱引用?
答案 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
隐含了语义,它完全控制了它指向的对象。