关于C++中的垃圾回收

3

我正在了解垃圾回收器模式。据提到,这种架构模式通过有效地消除内存泄漏和悬空指针来消除绝大部分与内存相关的问题。

我知道使用垃圾回收器可以消除内存泄漏,但是垃圾回收器如何解决悬空指针的问题呢?请给我一个例子,说明如何使用标记清除算法实现垃圾回收器来解决悬空指针的问题。

谢谢!

2个回答

6
在GC环境中,悬空指针的问题是间接处理的:只有在没有任何指向该对象的指针时,才会删除对象,因此不会删除任何可能留下悬空指针的情况。也就是说,根本不会出现悬空指针的问题。请注意保留HTML标记,但不要写解释。

“问题不可能出现”——在设计自动垃圾回收的语言中。用C++实现垃圾回收是不同的。例如,返回非静态局部指针将始终导致悬空指针。 - Cheers and hth. - Alf
1
@Alf:没错。我表述不够明确。当有人说 GC(比如C# / Java语言支持的)有效消除了内存泄漏和悬空指针时,他们指的是GC将不会销毁它管理的对象,如果仍然存在活动指针,并且不会留下悬空指针。 - David Rodríguez - dribeas

0

当您在对象的生命周期结束后使用其地址时,会出现悬空指针。这可能发生在从函数返回自动变量的地址或在释放内存块后使用内存块的地址等情况下。以下代码片段显示了这种情况:

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中已被释放的指针调用的。

这不是答案。他在问:“但垃圾回收器如何解决悬空指针的问题?请给我一个使用标记和清除算法实现垃圾回收器来解决悬空指针问题的例子。” - bayCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接