我有一个全局变量 int[] 和以下函数,现在对函数进行多次的调用,length长度基本上每次都会不同.请问这样操作会造成内存泄露吗?static int[] t; // global variablevoid testIt(int length)
{
int[] temp = new int[length];
for(int i=0;i<length;i++)
{
temp[i]=i;
}
t = temp;
}
{
int[] temp = new int[length];
for(int i=0;i<length;i++)
{
temp[i]=i;
}
t = temp;
}
是C++?C++的数组定义不是这么写的。
{
public Form1()
{
InitializeComponent();
} static int[] t;}
这个我个人理解一般不会的。
static Form1 [] t;
这个我个人理解会的。
同样不会,Form的Finalize方法会自动调用Disopse。
注意,int[] t只是定义了一个指向数组对象的引用,而数组本身是在托管堆上分配的。因此无论你怎么做,都不会内存泄露。
如果FORM一直没有结束,在FORM结束之前,执行我所举例的函数1万次,那么是不是会出现内存泄露,也就是占用系统的资源会不断增加?
如果FORM一直没有结束,在FORM结束之前,执行我所举例的函数1万次,那么是不是会出现内存泄露,也就是占用系统的资源会不断增加?不会。一亿次也不会。
如果FORM一直没有结束,在FORM结束之前,执行我所举例的函数1万次,那么是不是会出现内存泄露,也就是占用系统的资源会不断增加?
肯定会了。
如果FORM一直没有结束,在FORM结束之前,执行我所举例的函数1万次,那么是不是会出现内存泄露,也就是占用系统的资源会不断增加?
首先,Memory Leak是指内存持续增加,短时的增加浮动是正常的。然后再说Memory Leak会不会发生,你举的例子是托管资源(数组),由CLR自动执行垃圾回收。如果会发生内存泄露的话,谁还敢托管,谁还敢用.net。
然后从细节上来说,你方法里面定义的是个局部变量,方法执行完毕之后,退出作用域,这个变量已经是内存垃圾了,等待回收。如果你方法里是使用那个类的静态数组成员,那么每次为其新赋值的时候,之前的那个值也已就变成了垃圾,等待回收,然后当垃圾回收操作被执行的时候,这些内存都被释放掉了。
你的程序不是访问 static 的变量 t 么?它最终所引用的数组的内存大小跟 new 多少次 From、调用多少次函数,没有直接关系,只跟最后一次访问有关。如果你观察过数据库的文件大小,你就会发现,它不会动不动就收缩文件size的。因为那是费力不讨好的。同样地,类似.net这样的环境,也不会随便因为回收垃圾内存,就动不动去收缩所申请的内存。因此你可能经常看到.net程序很快申请了30M内存,然后就稳定下来(如果没有遇到系统Idel的情况那么不会随便收缩内存)。因此一开始.net进程快速申请较多的内存,是非常好的策略,不是什么“内存泄露”。