在wince5.0下用new申请的内存是如何来释放的?系统会自动来释放的么?似乎不会,在监控下显示的内存在一点点减少。用gc来清理也不可行,请教下各位做过wince编程的大侠们,怎么来释放的?C#语言编写的程序。

解决方案 »

  1.   

    只要是C#语言写的,在托管下运行,不需要关心释放啊。释放内存是由.NET虚拟机来完全,和系统没有关系。
      

  2.   

    wince不太清楚,我给你一段window清理内存的方法,希望你能用的上:
    [DllImport("kernel32.dll")]
            private static extern bool SetProcessWorkingSetSize(            IntPtr process,            int minSize,            int maxSize);
            /// <summary>
            /// 清理内存
            /// </summary>
            public  static void FlushMemory()
            {
                GC.Collect();            GC.WaitForPendingFinalizers();            if (Environment.OSVersion.Platform == PlatformID.Win32NT)                SetProcessWorkingSetSize(System.Diagnostics. Process.GetCurrentProcess().Handle, -1, -1);
            } 
            
      

  3.   

    不再使用对象=null;
    可以使垃圾回收更有效率
      

  4.   

    to:jxxx2967
    理论上是这样,但是实际上它确实是没有释放,我用的平台是wince5.0
    to:mafgm
    谢谢,可能用不上,试过,但是没有多大改进
    to:jhkemail
    如果是这样,我申请的所有临时变量岂不是要用过的都要=null一下?太麻烦了吧……
      

  5.   

    Finalize 方法
        1.仅在要求终结的对象上实现 Finalize。存在与 Finalize 方法相关的性能开销。 
    如果需要 Finalize 方法,应考虑实现 IDisposable,以使类的用户可以避免调用 Finalize 方法带来的开销。(juky_huang注:在实现IDisposable的类中,可以通过GC.SuppressFinalize来停止Finalize的运行,这样只要显式的调用了Dispose方法,就能给用户提供更小的开销。如果用户没有显式的调用Dispose方法,也就是没有停止Finalize的运行,这样就可以隐式的实现非托管资源的释放) 
        2.不要使 Finalize 方法更可见。它应该是 protected,而不是 public。 (juky_huang注:这个很重要,Finalize方法一般是系统调用,用户不去显式的调用它)
        [Page]3.对象的 Finalize 方法应该释放对象拥有的任何外部资源。此外,Finalize 方法应该仅释放由对象控制的资源。Finalize 方法不应该引用任何其他对象。 
        4.不要对不是对象的基类的对象直接调用 Finalize 方法。在 C# 编程语言中,这不是有效的操作。 
        5.从对象的 Finalize 方法调用 base.Finalize 方法。(juky_huang注:就是派生类调用基类的Finalize方法) 
      

  6.   

    base.Finalize 这个方法都没点出来,估计不支持
      

  7.   

    楼主是不是定义了大变量。大变量一般代数比较高,回收也是需要时间的。
    比如你有一个64K的大变量,这样的变量new好之后直接在1代的。
    而回收机制是0代回收很多次才会轮到1代回收。这时加入你的变量还忘记调用Disposed方法,那么会提升到2代,这样不知道要等到何时才能被回收呢。
    我觉得楼主可能是在因为.Net垃圾回收机制的问题才出现这种问题的。
    另外,只要代码是C#写的,没有用COM,应该不会出现泄漏,顶多回收时间长一点而已
      

  8.   

    没用的对象 = null 是一种好的习惯.
      

  9.   


    finalize是不能手动调用的,可以试下dispose方法
    可能是非托管资源没有释放吧,因为只有执行了finalize方法才能回收非托管资源
    而finalize执行有条件的,要CLR关闭,垃圾回收,1代满了等等所以你手动调用GC回收下
      

  10.   

    GC也不行?
    先用dispose在GC
    或者GC,2次因为非托管资源可能出现复苏的现象,因为有2个结构保存非托管资源的句柄,你去看下框架设计第2版本的垃圾回收,对于非托管资源的垃圾回收,讲的很清楚。
      

  11.   

    GC2次??楼上几位说的似乎可行,我在测试中把使用过的局部变量(比较大的二维数组赋值null)似乎有好转,但是程序跑死存在随即性非常强,有可能是一个操作执行几十次就跑死,也有可能是执行上千次都没问题,按理说应该是内存泄漏吧?但是改了之后效果并不明显
      

  12.   


    很笼统的一个解释,而且释放并不干净,似乎还没有赋值null有效,
      

  13.   

    楼主是否存在递归,在.net中递归的话很容易就产生了貌似内存泄露的问题,因为长时间递归导致很长时间不释放局部变量,看起来就像内存泄露了
      

  14.   


    一般情况下我是不用递归的,尽量用for循环来取代递归,哪怕写起来会麻烦点,即便是for循环一般也是比较小的循环,不存在楼上说的这个情况