【发布时间】:2021-10-17 21:14:10
【问题描述】:
我特意在下面的代码中引入了循环依赖。
我的疑问是,当共享指针 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;
}
【问题讨论】:
-
它们彼此处于参考循环中。
-
您可能混淆了范围和生命周期。两个共享指针都超出范围,但对循环引用执行它们的生命周期并没有结束。
-
@TanveerBadar - 如果两者都超出范围,则引用计数应为零。因此不会发生内存泄漏。这违反了共享指针引用计数逻辑。你能说得详细一点吗,因为我不明白你的意思。我知道我故意添加了循环依赖。 C++ 标准规定,如果引用计数达到零,则对象被销毁。
-
因为它不是具有自动存储期限的对象。它是一个非静态数据成员,它与它所属的类的对象一起创建和销毁。考虑一下:
Widget* p; { p = new Widget; }你不会期望p->mGadget在右大括号处被销毁,而*p还活着,对吗? -
好吧,当然,如果这对你有帮助的话。它一开始并没有与任何特定的范围相关联,所以真的没有什么可以摆脱的。
标签: c++ c++11 shared-ptr circular-dependency