2011-06-21 42 views
3

我在阅读垃圾回收器模式。有人提到,这种架构模式通过有效消除内存泄漏和悬空指针来消除绝大多数与内存相关的问题。关于C++中的垃圾回收

我知道使用垃圾收集器可以消除内存泄漏,但垃圾收集器如何解决悬挂指针的问题?请给我一个示例,说明如何使用垃圾收集器解决悬挂指针问题,假设我正在使用标记和扫描算法来实现它。

谢谢!

回答

6

悬空指针的问题是间接处理的:在GC环境中,只有在没有指向对象的指针时才会删除对象,因此在任何情况下它都不会被删除摇晃的指针。也就是说,根本不会有悬挂指针,并且问题不会发生。

+0

“这个问题不会发生” - 使用自动垃圾收集设计的语言。在C++中使用垃圾回收是不同的。例如,返回一个指向非静态本地的指针,不管发生什么,都会给你一个悬挂指针。 –

+1

@Alf:对。我不够明确。当有人说* GC *(如在该语言支持的C#/ Java中)*有效地消除了内存泄漏和悬挂指针*时,它们指的是GC不会销毁它管理的对象,如果仍然存在活动指针,结果它不会留下悬挂的指针。 –

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的 析构函数指针调用。

+0

这不是答案。他问:“但是垃圾收集器如何解决悬挂指针的问题?**请给我一个例子,说明如何使用垃圾收集器解决悬挂指针的问题,假设我正在使用标记来实现它扫描算法“。 – bayCoder