我试图理解c++11 中的unique_ptr
,shared_ptr
和。weak_ptr
我听说这weak_ptr
对于缓存和中断循环等事情会很好。我听说他们与shared_ptrs
.
shared_ptrs
但是在这方面,和 和有什么区别unique_ptrs
?为什么weak_ptr
get 只能与一个一起使用而不与另一个一起使用?为什么我不想弱引用别人拥有的东西?
我试图理解c++11 中的unique_ptr
,shared_ptr
和。weak_ptr
我听说这weak_ptr
对于缓存和中断循环等事情会很好。我听说他们与shared_ptrs
.
shared_ptrs
但是在这方面,和 和有什么区别unique_ptrs
?为什么weak_ptr
get 只能与一个一起使用而不与另一个一起使用?为什么我不想弱引用别人拥有的东西?
从技术上讲, Aweak_ptr
是一种挂在一组shared_ptr
管理某个共享对象的 s 的引用计数器上的方法。当最后一个shared_ptr
对象被销毁时,对象也被销毁,但只要它有weak_ptr
s,它的引用计数器就会一直存在。因此,通过任何仍然weak_ptr
存在的对象,您可以检查对象是否仍然存在或已被销毁。
如果它仍然存在,那么weak_ptr
您可以从中获得一个shared_ptr
可以让您引用该对象的对象。
它的主要用途是打破循环。
特别是,一个对象可以包含一个weak_ptr
对它自己的引用计数器的持有,这允许你shared_ptr
从对象本身获得一个对象。也就是说,a使用与该对象的其他 sshared_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 的新手,所以如果有人知道得更好,我将不胜感激。
我认为没有太多理由,否则,你会使用 a ,shared_ptr
因为它会破坏 a 的全部目的unique_ptr
。Aunique_ptr
具有隐含的语义,即它可以完全控制它指向的对象。