假设有一个类A,它有一个成员
public int[] A_fun()

    int[] a= new[100]{1,2,……,100}; 
    return a;
}则,当A在Dispose()以后,
之前调用A_fun()获得的数据是否可以正常使用?
如果a是A的成员呢?

解决方案 »

  1.   

    一个非静态的class A的实例AInstance在执行Dispose()后其成员不可以正常使用.
    不过其占用的内存不一定会立即释放
      

  2.   

    可以用的。
    这样来解释,从c++语言来看吧,可能有点不同,大体思想一样public int* A_fun() 
    {  
        int* a= new[100]{1,2,……,100};  
        return a; (这里改成delete a;)
    } 注意delete a和delete[] a是不同的,delete[] a才是真正释放堆空间,而前者是什么,想必也猜出来了吧我们再回来c#
    public int[] A_fun() 
    {  
        int[] a= new[100]{1,2,……,100};  
        return a; 
    } 1.开空间new[100]{1,2,……,100};  
    2.把a指针返回出去
    3.由于过了这个函数,a消亡,此时不必担心那块空间没人认领,因为你肯定是这样调用的 int[] b = A_fun() ;
      

  3.   

    只要gc没有回收Arrary对象a,这个a就一只可用。
    gc在何时回收:
    gc会在任何一代内存分配区满了之后,或者显示调用GC.Collect(),清理内存,清理时会尝试标记所有的可用对象,并提升为下一代对象,所有不可到达的对象将被回收。所以具体的时间取决于程序的实现,是个不定的。
      

  4.   

    To Avoid:
    你查查.NET GC的机制就知道了。在托管下,任何内存分配都是由GC完成的(PIvoke,Marshal除外)。
      

  5.   

    To lalac:先不管GC。我重复一遍,方法自己申请的内存与类是否销毁无关。