【发布时间】:2011-06-21 08:53:08
【问题描述】:
我正在阅读有关垃圾收集器模式的信息。有人提到,这种架构模式通过有效地消除内存泄漏和悬空指针,消除了绝大多数与内存相关的问题。
我知道使用垃圾收集器可以消除内存泄漏,但是垃圾收集器如何解决悬空指针的问题?请举例说明如何使用垃圾收集器解决悬空指针问题,假设我使用标记和扫描算法实现它。
谢谢!
【问题讨论】:
我正在阅读有关垃圾收集器模式的信息。有人提到,这种架构模式通过有效地消除内存泄漏和悬空指针,消除了绝大多数与内存相关的问题。
我知道使用垃圾收集器可以消除内存泄漏,但是垃圾收集器如何解决悬空指针的问题?请举例说明如何使用垃圾收集器解决悬空指针问题,假设我使用标记和扫描算法实现它。
谢谢!
【问题讨论】:
悬空指针的问题是间接处理的:在 GC 环境中,一个对象只有在没有指向该对象的指针时才会被删除,因此在任何情况下它都不会被删除,它会留下悬空指针。也就是根本不会有悬空指针,也不会出现问题。
【讨论】:
一个dangling pointer出现在你使用一个对象的地址之后 它的生命已经结束。这可能发生在返回等情况下 从函数或使用自动变量的地址 内存块释放后的地址。以下 代码 sn-p 显示了这一点:
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 中的析构函数。
【讨论】: