问题1:对于一个String szString="abc";如果再令szString="bcd",那么内存快"abc"是否会自动释放?如果释放,那如果还有其他String的值也是"abc"是否会受到影响?如果不释放,那如果程序很大的话是不是生成大量垃圾数据占据内存空间?问题2:如果上述问题改成一个自己写的类,在赋值的时候是否会自动释放原来的空间?如果不能,是否有技术能实现自动释放?因为我自己写的类很大,如果不释放恐怕会累积大量无用内存空间导致系统运行效率降低。

解决方案 »

  1.   

    对于一个String szString="abc";如果再令szString="bcd",那么内存快"abc"是否会自动释放?
    >>>会自动释放,但不会这么快,要等.net启动GC回收机制才能回收那如果还有其他String的值也是"abc"是否会受到影响?
    >>>不受影响那如果程序很大的话是不是生成大量垃圾数据占据内存空间? 
    >>>现在的电脑,内存动不动是2G, 根本丝毫不要担心这个问题可实现IDispose接口,如果不怕冗长,在使用完对象后设 obj=null; 这样GC会第一时间回收
      

  2.   

    那么请问IDispose接口是怎么实现的呢?能否说明下
      

  3.   


    问题1:对于一个String szString="abc";如果再令szString="bcd",那么内存快"abc"是否会自动释放?如果释放,那如果还有其他String的值也是"abc"是否会受到影响?如果不释放,那如果程序很大的话是不是生成大量垃圾数据占据内存空间? //答:如果再令szString="bcd",内存中的abc有可能会释放,这要看是不是还有string类型的变量也
    //指向这个"abc",net中的string内存分配是很智能的
    //string a = "abc"; string b = "abc" 这儿就不会在托管堆上开两个"abc",而是a/b都
    //指向那个"abc",这个楼主可以用ReferenceEquals(a,b)来看看
    //回到上面的话题,如果没有其他string类型变量指向这个"abc",那么在"将来",GC会自动回收这个"abc"
    //这个还要看"代龄",.net中将堆中没有引用的对象分3个代龄,0/1/2 代领越大(2),则在GC的时候
    //越晚被回收,因为GC要首先回收那些早期丢失引用的对象问题2:如果上述问题改成一个自己写的类,在赋值的时候是否会自动释放原来的空间?如果不能,是否有技术能实现自动释放?因为我自己写的类很大,如果不释放恐怕会累积大量无用内存空间导致系统运行效率降低//如果楼主想手动回收也可以
    //GC.Collect(),这个方法有重载的,GC.Collect(int index),这里的index,指的就是丢失引用
    //的对象的代龄
      

  4.   

    这个是关于引用的话题了。
    string 对象是个特殊的引用。上面筒子说得对,如果俩变量都是“abc”的话,其实是俩变量都指向同一地址,如果
    string a="abc";
    a += "d";
    那么实际上并不是在内存中修改"abc",在其后面加了个"d",而是创建了一个新的字符串"abcd",然后把string a指向了这个新创建的"abcd"。如果有其他变量引用了"abc"的话,"abc"不会被释放。
    如果是自己写的类,定义俩实例,把其中一个赋值给另外一个的时候,是传递的引用。
    如果修改其中任意一个实例的某个属性,另一个实例的相关属性也被修改,但是,如果设置其中任意一个实例为null.则另一个实例貌似不受任何影响,考虑以下代码:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using System.Diagnostics;namespace ConsoleApplication1
    {
        class A
        {
            public string str;
            public A()
            {
                str = "init";
            }
           
        }
        class Program
        {
            public static void Main()
            {
                A a = new A();
                A b = a;
                b.str = "b";
                Console.WriteLine("a:{0}", a.str);//output a:b
                Console.WriteLine("b:{0}", b.str);//output b:b            a = null;            
                Console.WriteLine("b:{0}", b.str);//output b:b
                Console.WriteLine("a:{0}", a.str);//NullReferenceException
          }
        }
    }
      

  5.   

     我试过程序定时调用GC.Collet()方法,不管用,程序占用的内存还是150MB左右,
    我那系统没有实现任何IDisposable接口. 如果类特巨大,建议实现IDisposable接,在try finally end 内调用Dispose,然后设变量 obj=null; 如果操作流,这个动作一定要做