C# C中相互引用对象的垃圾收集#

C# C中相互引用对象的垃圾收集#,c#,garbage-collection,weak-references,C#,Garbage Collection,Weak References,当然这个问题以前也有人问过,但我找不到任何关于这个问题的线索,所以链接到回答的问题也会很有帮助: 我有一个体积类(体素体积),它包含一个切片数组(切片) 问题是,由于存在相互对象引用,卷永远不会被垃圾回收。出于这个原因,我将从切片到卷的引用实现为WeakReference: public class Slice { WeakReference myVolume; VoxelVolume Volume { get {

当然这个问题以前也有人问过,但我找不到任何关于这个问题的线索,所以链接到回答的问题也会很有帮助:

我有一个体积类(体素体积),它包含一个切片数组(切片)

问题是,由于存在相互对象引用,卷永远不会被垃圾回收。出于这个原因,我将从切片到卷的引用实现为WeakReference:

public class Slice
{
    WeakReference myVolume;

    VoxelVolume Volume
    {
        get
        {
            return (VoxelVolume)myVolume.Target;
        }
    }

    public Slice(VoxelVolume aVolume)
    {
        myVolume = new WeakReference(aVolume);
    }
}
现在垃圾收集可以工作了,但需要额外的WeakReference。因为我可以有成千上万的切片,所以WeakReference的工作量非常大

编辑:首先它没有显示,但是因为我们使用了大量内存,所以出现了“内存泄漏”。因此,我们使用JetBrains dotTrace查看了引用的和可用的对象。在那里,我们看到很多对象都是可用的,尽管它们不再被使用。正如我之前所说,使用WeakReference解决了这个问题

问题是,TreeView如何解决这些问题,因为TreeNode也了解TreeView

你知道一个合适的解决方案吗

多谢各位 马丁

问题是,由于存在相互对象引用,卷永远不会被垃圾回收

只有当某些东西可以访问
切片
体素体积
时,才会出现问题。当您不再有对任一对象的引用时,它们都可以进行垃圾收集。对象中的循环在.NET中不是问题,因为它不使用引用计数


当然,您确实需要确保没有任何GC根对
切片
体素体积
的引用。您还没有给我们提供足够的上下文来了解这里发生了什么。

CLR中的GC引擎应该收集循环引用的对象,只要没有其他人引用任何对象


实现IDisposable模式并在决定不再需要引用时清除引用也是一个好主意。它可以减少大量内存泄漏的可能性,以防有不好的东西保留了一个您没有注意到的引用

NET垃圾收集器正确处理对象图中未引用的循环。例如,如果对象A引用了对象B,而B引用了A,但前提是A和B都不能从GC根访问,则将收集它们,即使它们彼此有引用。您如何确定您的卷未被收集?嗨,铱星。你是对的。请参阅我在上面文本中的编辑。由于WeakReference版本没有显示该问题,它表明您的切片仍然可以以某种方式访问。dotTrace是否提供了关于哪些(体素体积除外)可能引用切片的任何指示?我将再次查看。如果我知道更多,我将在这里添加一条评论。谢谢。嗨,乔恩。我在我的文本中进行了编辑,我使用JetBrains dotTrace进行了调试。正如我在所有文章中看到的,循环引用可以由GC解析。看来我的代码有问题。
public class Slice
{
    public VoxelVolume Volume
    {
        get;
        private set;
    }

    public Slice(VoxelVolume aVolume)
    {
        Volume = aVolume;
    }
}
public class Slice
{
    WeakReference myVolume;

    VoxelVolume Volume
    {
        get
        {
            return (VoxelVolume)myVolume.Target;
        }
    }

    public Slice(VoxelVolume aVolume)
    {
        myVolume = new WeakReference(aVolume);
    }
}