我正在阅读安全的C ++,作者提到了循环引用,如下所示。
考虑两个包含彼此指针的对象
class A;
class B { public: A* a; };
class A { public: B* b; };
这种情况被称为“循环参考”。指针存在于A和B中,但如果没有指向其他地方的其中一个对象的指针,那里 无法回收任何变量的内存,因此会产生内存泄漏。这两个物体将永远幸福地生活,永远不会被摧毁。
我的问题
感谢您的时间和帮助
答案 0 :(得分:4)
有些垃圾收集算法非常简单,它们无法收集两个相互引用的无法访问的对象(基本上,如果gc仅使用引用计数)。
但是,C ++并不保证提供任何垃圾收集。您显示的代码甚至不使用引用计数。因此,就你所展示的内容而言,对象泄露的原因(如果有任何对象被泄露)与循环引用无关,这是因为你没有释放它们。
您所引用的图书似乎可能是在您选择不在此问题中显示的某些其他信息的背景下发言 - 可能在本书中有一些参考计数。
答案 1 :(得分:0)
有问题的概念是可达性。基本上,开始 从一组基本指针(活动变量等),你可以 直接或间接地到达有问题的对象。如果不, 对象无法访问。
无法到达的对象的一个简单例子就是那个 没有指针。循环参考示例是另一个 示例:有两个指向对象的指针, 但是对象仍然无法访问。
在大多数语言中,如果某个对象无法访问,那么它就是 垃圾收集,迟早。在C ++中,您需要 在它之前显式删除任何动态分配的对象 变得无法到达;否则,你永远不能删除它(和 记忆已泄露)。一种常用的C ++模拟技术 垃圾收集是引用计数指针;这种技术 (不像其他垃圾收集技术)不处理 循环引用正确,因此会泄漏内存。
虽然C ++会受益于垃圾收集,但这很重要 认识到这与不是在C ++中的问题一样多 其他语言。在C ++中,通常是动态分配的对象 仅对应于已定义生命周期的对象,和 这将在一些外部的反应中明确地被破坏 事件(或永远不会被破坏的事件,因为曾经的事件 程序已经完成,程序已经完成, 期 - 考虑编译器中的解析树)。因为 C ++支持值语义,大多数其他对象不 动态分配,但相当于局部变量或数据 一个更大的对象的成员,并有他们的一生 自动管理。虽然C ++有很多 “智能”指针自动管理删除 记忆,如果你发现自己被广泛使用, 你可能在滥用动态分配。