用于将weak_ptr应用于unique_ptr的内容
Use for applying weak_ptr to contents of unique_ptr
我试图理解 c++11 附带的unique_ptr
、shared_ptr
和weak_ptr
。
我听说weak_ptr
的对于缓存、中断循环等事情会很好。我听说他们和shared_ptrs
合作得很好.
但在这方面,shared_ptrs
和unique_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
具有隐含的语义,即它可以完全控制它指向的对象。
- 为什么 std::unique 不调用 std::sort?
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 生成"unique"矩阵
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 我对 std::unique(算法)C++有问题
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- std::shared_ptr::unique(),复制和线程安全
- 如何在C++03中用自定义谓词调用std::unique
- C++中的指针否定 (!ptr == NULL)
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误