c++ - 为什么共享指针在 main 末尾没有超出范围?
问题描述
我特意在下面的代码中引入了循环依赖。
我的疑问是,当共享指针 w 超出范围时,引用计数不为零,因此 Widget 对象不会被破坏。
但是在 main 结束时,共享指针“w->mGadget->mWidget”是否也会超出范围,因为在 main 结束时已知所有内容都将不复存在?我对这里的范围有点困惑。我期望在 main 退出时所有实体范围都应该结束。我的理解中缺少的链接在哪里?
#include <memory>
#include <iostream>
struct Gadget;
struct Widget
{
std::shared_ptr<Gadget> mGadget;
};
struct Gadget
{
std::shared_ptr<Widget> mWidget;
};
int main()
{
auto w = std::make_shared<Widget>();
w->mGadget = std::make_shared<Gadget>();
w->mGadget->mWidget = w;
return 0;
}
解决方案
这里有三个 std::shared_ptr
s:
w
在main
mGadget
mWidget
后两者是在动态范围内创建的对象的成员。
w
main()
与任何其他自动范围的对象一样,超出了 的范围。但是mGadget
和mWidget
被留下,每个都引用对方的对象。这两个对象是在动态范围内创建的。
此循环引用可防止任何一个对象的最后一个引用超出范围并被破坏。一个相互保证的僵局。
推荐阅读
- ios - 在列表顶部插入项目时如何在 LazyVStack / VStack 中保持滚动位置
- fortran - 可能带有 GNU Fortran 的 MS/Intel Fortran 模块?
- php - Laravel 计算具有关系的多个选定数据
- java - JDK1.8 用于生产,但 JDK 1.7 用于测试环境
- ios - 在登录和注册堆栈上禁用抽屉导航向右滑动,但在 React Native Navigation 5.x 中的其他堆栈上禁用
- java - 无法连接到在 localhost Mac OS v10.15.5 上运行的 java SFTP 服务器
- c++ - 在头文件中定义变量不会出错
- python - 如何使用基于函数的视图突出显示结果页面中的搜索查询?
- angular - 从浏览器控制台中删除材料警告
- vb.net - 清除访问数据库表并在 VB.NET 中替换其内容