假设有一个类A,它有一个成员
public int[] A_fun()
{
int[] a= new[100]{1,2,……,100};
return a;
}则,当A在Dispose()以后,
之前调用A_fun()获得的数据是否可以正常使用?
如果a是A的成员呢?
public int[] A_fun()
{
int[] a= new[100]{1,2,……,100};
return a;
}则,当A在Dispose()以后,
之前调用A_fun()获得的数据是否可以正常使用?
如果a是A的成员呢?
不过其占用的内存不一定会立即释放
这样来解释,从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() ;
gc在何时回收:
gc会在任何一代内存分配区满了之后,或者显示调用GC.Collect(),清理内存,清理时会尝试标记所有的可用对象,并提升为下一代对象,所有不可到达的对象将被回收。所以具体的时间取决于程序的实现,是个不定的。
你查查.NET GC的机制就知道了。在托管下,任何内存分配都是由GC完成的(PIvoke,Marshal除外)。