这是一个非常基本的问题.我将使用C和
Java来制定它,但它确实与语言无关.
考虑C中一个众所周知的问题:
struct Obj
{
boost::shared_ptr m_field;
};
{
boost::shared_ptr obj1(new Obj);
boost::shared_ptr obj2(new Obj);
obj1->m_field = obj2;
obj2->m_field = obj1;
}
这是一个内存泄漏,大家都知道:)@R_301_463@案也是众所周知的:应该使用弱指针来打破“引用联盟”.还知道这个问题原则上不能自动解决.解决这个问题的程序员是唯一的责任.
但是有一个积极的事情:程序员完全控制了refcount值.我可以在调试器中暂停我的程序,并检查obj1,obj2的引用,并了解有一个问题.我还可以在对象的析构函数中设置断点,并观察破坏时刻(或者发现该对象未被销毁).
我的问题是关于Java,C#,ActionScript和其他“垃圾回收”语言.我可能会错过一些东西,但在我看来他们是
不要让我检查物体的计数
>对象被破坏时,不要让我知道(当对象暴露于GC时可以)
我经常听到这些语言不允许程序员泄漏记忆,这就是为什么他们是伟大的.据我所知,他们只是隐藏内存管理问题,难以解决.
最后,问题本身:
Java的:
public class Obj
{
public Obj m_field;
}
{
Obj obj1 = new Obj();
Obj obj2 = new Obj();
obj1.m_field = obj2;
obj2.m_field = obj1;
}
>是内存泄漏吗?
>如果是,我如何检测并修复它?
>如果否:为什么?