首页 > 解决方案 > 为什么共享指针在 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;
}

标签: c++c++11shared-ptrcircular-dependency

解决方案


这里有三个 std::shared_ptrs:

  1. wmain
  2. mGadget
  3. mWidget

后两者是在动态范围内创建的对象的成员。

wmain()与任何其他自动范围的对象一样,超出了 的范围。但是mGadgetmWidget被留下,每个都引用对方的对象。这两个对象是在动态范围内创建的。

此循环引用可防止任何一个对象的最后一个引用超出范围并被破坏。一个相互保证的僵局。


推荐阅读