我有一个全局变量 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;
}

解决方案 »

  1.   

    是C#么?C#不允许定义全局变量。也没有内存泄露这个概念——如果你不使用非托管资源的话。
    是C++?C++的数组定义不是这么写的。
      

  2.   

    是c#,c#没有全局变量?或者说是在一个cs文件的class里面他是全局的吧,例如: public partial class Form1 : Form
     {
            public Form1()
            {
                InitializeComponent();
            }        static int[] t;}
      

  3.   

      static int[] t;
    这个我个人理解一般不会的。
      static Form1 [] t;
    这个我个人理解会的。
      

  4.   


    同样不会,Form的Finalize方法会自动调用Disopse。
      

  5.   


    注意,int[] t只是定义了一个指向数组对象的引用,而数组本身是在托管堆上分配的。因此无论你怎么做,都不会内存泄露。
      

  6.   


    如果FORM一直没有结束,在FORM结束之前,执行我所举例的函数1万次,那么是不是会出现内存泄露,也就是占用系统的资源会不断增加?
      

  7.   


    如果FORM一直没有结束,在FORM结束之前,执行我所举例的函数1万次,那么是不是会出现内存泄露,也就是占用系统的资源会不断增加?不会。一亿次也不会。
      

  8.   


    如果FORM一直没有结束,在FORM结束之前,执行我所举例的函数1万次,那么是不是会出现内存泄露,也就是占用系统的资源会不断增加?
    肯定会了。
      

  9.   


    如果FORM一直没有结束,在FORM结束之前,执行我所举例的函数1万次,那么是不是会出现内存泄露,也就是占用系统的资源会不断增加?
    首先,Memory Leak是指内存持续增加,短时的增加浮动是正常的。然后再说Memory Leak会不会发生,你举的例子是托管资源(数组),由CLR自动执行垃圾回收。如果会发生内存泄露的话,谁还敢托管,谁还敢用.net。
    然后从细节上来说,你方法里面定义的是个局部变量,方法执行完毕之后,退出作用域,这个变量已经是内存垃圾了,等待回收。如果你方法里是使用那个类的静态数组成员,那么每次为其新赋值的时候,之前的那个值也已就变成了垃圾,等待回收,然后当垃圾回收操作被执行的时候,这些内存都被释放掉了。
      

  10.   


    你的程序不是访问 static 的变量 t 么?它最终所引用的数组的内存大小跟 new 多少次 From、调用多少次函数,没有直接关系,只跟最后一次访问有关。如果你观察过数据库的文件大小,你就会发现,它不会动不动就收缩文件size的。因为那是费力不讨好的。同样地,类似.net这样的环境,也不会随便因为回收垃圾内存,就动不动去收缩所申请的内存。因此你可能经常看到.net程序很快申请了30M内存,然后就稳定下来(如果没有遇到系统Idel的情况那么不会随便收缩内存)。因此一开始.net进程快速申请较多的内存,是非常好的策略,不是什么“内存泄露”。
      

  11.   

    有些人对.net、java等自动进行垃圾回收的系统非常“嫉妒”,找不着“内存泄露”的毛病,总是不甘心哦。