【问题标题】:About Garbage collection in C++关于 C++ 中的垃圾收集
【发布时间】:2011-06-21 08:53:08
【问题描述】:

我正在阅读有关垃圾收集器模式的信息。有人提到,这种架构模式通过有效地消除内存泄漏和悬空指针,消除了绝大多数与内存相关的问题。

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

谢谢!

【问题讨论】:

    标签: c++ garbage-collection


    【解决方案1】:

    悬空指针的问题是间接处理的:在 GC 环境中,一个对象只有在没有指向该对象的指针时才会被删除,因此在任何情况下它都不会被删除,它会留下悬空指针。也就是根本不会有悬空指针,也不会出现问题。

    【讨论】:

    • “问题不会发生”——使用一种为自动垃圾回收而设计的语言。在 C++ 中使用垃圾收集是不同的。例如,返回一个指向非静态局部变量的指针无论如何都会给你一个悬空指针。
    • @Alf:对。我不够明确。当有人说 GC(如该语言支持的 C#/Java 中)有效地消除了内存泄漏和悬空指针时,他们指的是 GC 不会破坏一个如果仍然存在活动指针,则它管理的对象,并且它不会因此留下悬空指针。
    【解决方案2】:

    一个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 中的析构函数。

    【讨论】:

    • 这不是答案。他在问:“但是垃圾收集器如何解决悬空指针的问题?请给我一个例子,说明如何使用垃圾收集器解决悬空指针问题,假设我正在使用它来实现它标记和扫描算法。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多