相关疑难解决方法(0)

垃圾收集器和循环引用

考虑这两个类:

public class A
{
     B b;
     public A(B b) { this.b = b; }
}

public class B
{
     A a;
     public B() { this.a =  new A(this); }
}
Run Code Online (Sandbox Code Playgroud)

如果我有类似上面设计的类,那么垃圾收集器(GC)会收集这些类的对象吗?

假设我这样做:

void f()
{
     B b = new B();
}
Run Code Online (Sandbox Code Playgroud)

在这个方法中,我创建了一个B被调用的实例b,当方法返回时,b超出范围,GC应该能够收集它,但是如果它要收集它,它必须先收集a它是成员的B,并收集a,它需要收集b第一是的构件A.它变成了圆形.所以我的问题是:这样的循环引用会阻止GC收集对象吗?

  • 如果是,那我们怎样才能避免这个问题呢?我们怎样才能确保在课堂设计中没有循环参考?是否有任何工具(或编译器选项)可以帮助我们检测循环引用?
  • 如果没有,我们在哪里和为什么使用WeakReference课程?它的目的是什么?

c# garbage-collection circular-reference

57
推荐指数
4
解决办法
2万
查看次数

C#事件内存泄漏

这些未订阅事件何时发生内存泄漏?我应该编写析构函数还是实现IDisposable来取消订阅事件?

c# memory-leaks

14
推荐指数
2
解决办法
9804
查看次数

同一个程序集中的循环引用是件坏事吗?

假设我在同一个程序集中有以下类

public class ParentClass : IDisposable
{
  public ChildClass Child
  {
    get { return _child; }
  }
}   

public class ChildClass 
{
   public ParentClass Parent
   {
     get { return _parent; }
     set { _parent= value; }
   }

   public ChildClass (ParentClass parent)
   {
     Parent= parent;
   }

}
Run Code Online (Sandbox Code Playgroud)

如果我错了,请纠正我,但这是糟糕的设计.这会导致内存泄漏或其他一些不可预见的问题吗?显然垃圾收集器能够处理这种循环引用.

编辑

如果这两个类最终在其他类中被这样使用怎么办?

ParentClass objP = new ParentClass ();
ChildClass objC =new ChildClass(objP);
objP.Child = objC;
Run Code Online (Sandbox Code Playgroud)

想一想......

.net c# circular-dependency circular-reference

13
推荐指数
2
解决办法
1690
查看次数

CLR垃圾收集方法是否意味着抛出循环对象引用是安全的?

我有一个理论认为CLR垃圾收集机制意味着我可以在对象层次结构中使用循环引用,而不会为拆卸和垃圾收集创建死锁.这是一个安全的假设吗?(目标语言VB.NET)

.net c# vb.net garbage-collection

7
推荐指数
1
解决办法
956
查看次数

自处理事件是否会阻止实例被垃圾回收?

我读了问题的答案.事件处理程序是否阻止了垃圾收集的发生?,但是当发布者成为目标时会发生什么?

更具体地说,我正在为WPF应用程序使用MVVM设计.Model-View类会在每次更改时引发NotifyPropertyChanged.在某些类中,我需要在修改某些内容时调用方法.

我想这样做:

this.PropertyChanged += this.MyHandler;
Run Code Online (Sandbox Code Playgroud)

这个实例会被GC破坏吗?

.net c# events garbage-collection mvvm

3
推荐指数
1
解决办法
352
查看次数

C#垃圾收集器交叉引用

垃圾收集器是否可以为交叉引用的对象/类释放资源,这些资源不再从主程序引用.例如 -

class class1
{
    class2 m_RefClass2;
}
class class2
{
    class1 m_RefClass1;
}

class class3
{
    public class3()
    {
        class1 obj1 = new class1();
        class2 obj2 = new class2();
        obj1.m_RefClass2 = obj2;
        obj2.m_RefClass1 = obj1;
    }
}
Run Code Online (Sandbox Code Playgroud)

.net garbage-collection

2
推荐指数
1
解决办法
1204
查看次数