我正在阅读垃圾收集器模式。有人提到,这种架构模式通过有效消除内存泄漏和悬空指针来消除绝大多数与内存相关的问题。
据我所知,使用垃圾收集器可以消除内存泄漏,但垃圾收集器如何解决悬空指针的问题?请举例说明如何使用垃圾收集器解决悬空指针的问题,假设我使用标记和扫描算法实现它。
谢谢!
答案 0 :(得分:6)
悬空指针的问题是间接处理的:在GC环境中,只有在没有引用该对象的指针时才会删除对象,因此在任何情况下都不会删除它会留下悬空指针。也就是说,根本就没有悬空指针,问题就不会发生了。
答案 1 :(得分:0)
当您使用之后的对象地址时,会出现 dangling pointer 它的寿命结束了。这可能发生在返回等情况下 来自函数或使用的自动变量的地址 释放后的内存块的地址。下列 代码段显示了这个:
class Sample
{
public:
int *ptr;
Sample(int i)
{
ptr = new int(i);
}
~Sample()
{
delete ptr;
}
void PrintVal()
{
cout << "The value is " << *ptr;
}
};
void SomeFunc(Sample x)
{
cout << "Say i am in someFunc " << endl;
}
int main()
{
Sample s1 = 10;
SomeFunc(s1);
s1.PrintVal();
}
在上面的例子中,PrintVal()函数是 调用它由被释放的指针调用 SomeFunc中的析构函数。