这是内存泄漏还是未发布的资源

时间:2011-05-05 03:44:23

标签: c# asp.net

我不太确定这是否是内存泄漏,或者是否没有为GC发布资源,但由于我引用了另一个对象的属性,因此看起来很可疑。

我将XML文件反序列化为对象。然后我使用此对象来填充另一个对象的某些属性。这样做是否将这个反序列化的文件保存到内存中的某个对象:

 void Load() {
   MyClass deserializedClass = Helper.GetDeserializedFileFromXml(path, type);
   SetProperty(deserializedClass)
 }

 // MyProperty is a List<ADifferentClass>;
 void SetProp(MyClass myClass) {
    MyProperty = myClass.MyProperty;
 }

更新

我在阅读下面的评论后意识到,关键部分(以及我问这个的原因)是属性是引用类型,是不同类的List。

3 个答案:

答案 0 :(得分:1)

除非proprety的值以某种方式引用到类中,否则该类不应该继续存在。文件本身并没有留下(除非GetDeserializedFileFromXml做了意想不到的事情)。


进一步解释,如果你的课程是这样的:

public class MyClass {
   public String MyProperty { get; set; }
}

然后将属性分配给MyProperty不会导致MyClass停留。另一方面,如果它是这样的话:

public class MyClass {
    public MyClass() {
        MyProperty = new HoldsAReference(this);
    }
    public HoldsAReference MyProperty { get; private set; }
}
然后你的班级会坚持下去。

答案 1 :(得分:0)

所以,答案是肯定的,因为我的属性引用了另一个类(从XML反序列化)属性,它是一个引用类型。反序列化的类挂了。

答案 2 :(得分:-1)

首先,您要了解Reference and Value types的作品。

从那里,基本的理解是,任何父对象属性内的父对象和对象之间没有关系。它们是完全不同的实体,可以在内存中的任何位置,只能从一个引用到另一个。

因此,如果在属性中有对象的唯一引用(除了对象,谁拥有此属性),但在其他任何地方都没有对父对象fron的引用,那么父对象将被标记为垃圾回收。