shared_ptr、weak_ptr和循环依赖关系
shared_ptr, weak_ptr and circular dependencies
我认为我的问题类似于shared_ptr和weak_ptr的差异,但我感兴趣的是看看它们是如何协同工作的,而不是一系列差异。
维基百科关于shared_ptr和weak_ptr的页面指出,weak_pointer
可以用来解决循环依赖问题,并给出了一个例子:
std::shared_ptr<int> p1(new int(5));
std::weak_ptr<int> wp1 = p1; //p1 owns the memory.
{
std::shared_ptr<int> p2 = wp1.lock(); //Now p1 and p2 own the memory.
if(p2) //Always check to see if the memory still exists
{
//Do something with p2
}
} //p2 is destroyed. Memory is owned by p1.
p1.reset(); //Memory is deleted.
std::shared_ptr<int> p3 = wp1.lock(); //Memory is gone, so we get an empty shared_ptr.
if(p3)
{
//Will not execute this.
}
但是我没有看到循环依赖,所以我不明白weak_pointer
是如何解决这个问题的。
我本希望看到一些对象a
指向对象b
,而b
以某种方式指向a
(其中weak_ptr
填充在有向图的一条边之间以断链)。
这个例子好吗?我的想法不好吗?或者有更好的问题和解决方案的例子吗?
在当前版本的维基百科页面中,该示例旨在演示std::weak_ptr
的一般使用,而不是特别消除强循环引用。(循环参考仅在给出示例后才提到。)
该示例显示,尽管wp1
的寿命很长,但它并不拥有p1
所指向的内存,并且一旦p1
被重置,wp1
就会正确地检测到该内存的删除。换句话说,当通过弱指针(正确地)访问被删除的对象时,wp1
既不干扰动态分配的对象的删除,也不引起未定义的行为。
因为弱指针不会干扰释放,所以它们不仅对避免引用循环很有用,而且对实现存储附加属性或缓存现有对象计算属性的关联数组也很有用。由于此类缓存不会干扰释放,因此它们可以依赖于不再使用时删除的主对象,而无需特定于缓存的驱逐策略。
相关文章:
- 如何从C++中的依赖类型中获得它所依赖的类型
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 将依赖名称显式标记为类型名和模板的奇怪之处
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- C++GTKMM gui循环依赖关系
- 通过ccmake在cmake中缓存依赖选项
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 当基类是依赖类型时,这是一个缺陷吗
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 从不同的附加依赖项中识别等同命名的函数
- 如何在 CMake 中对目标依赖项进行分组?
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 为什么构建目录中新构建的共享库与安装目录中的副本具有不同的依赖项集?
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- 为什么内存屏障依赖于变量?
- node-gyp 的先有鸡还是先有蛋的问题:指向依赖项中的头文件
- 反转依赖于 end() 的迭代器
- GCC,CMake,预编译标头和维护依赖项