各位请指正我对以下代码的理解
1、开始执行时 a 分配在栈中 ,b和oc分配在内存堆中,但在栈中会有两个地址变量指向堆中的b和oc
2、当Page_Load执行完之后,在栈中变量a就销毁了,同时栈中的两个地址变量也销毁了,但是堆中的b和oc还存在,即使我们又浏览了别的网页,堆中的对象还是存在
  
  protected  void Page_Load(object sender, EventArgs e)
    {   
        int a=0;
        string b="hello";
        OdbcConnection oc = new OdbcConnection("DSN=mydsn");
        if (!IsPostBack)
        {  
            oc.Open();
            OdbcCommand odc = new OdbcCommand("SELECT * FROM [产品]", oc);
            OdbcDataReader odr = odc.ExecuteReader(CommandBehavior.CloseConnection);
            while (odr.Read())
            {
                Response.Write(odr[1].ToString());
            }
        }
        //odr.Close();   
 
    }

解决方案 »

  1.   

    1、开始执行时 a 分配在栈中 ,b和oc分配在内存堆中,但在栈中会有两个地址变量指向堆中的b和oc 
      
    正确
    2、当Page_Load执行完之后,在栈中变量a就销毁了,同时栈中的两个地址变量也销毁了,但是堆中的b和oc还存在,即使我们又浏览了别的网页,堆中的对象还是存在 不是很对,“堆中的对象还是存在”,这个不好说,垃圾收集器有可能已经将它清理了,也有可能没有
      

  2.   

    2、当Page_Load执行完之后,在栈中变量a就销毁了,同时栈中的两个地址变量也销毁了,这时堆中的b和oc引用计数变为零.堆中的对象都有一个引用计数,当一个对象的引用计数为零了,那么这个对象就可以被回收了,但并不意味着该对象被销毁.
    垃圾回收器会选择一个最佳的时机去销毁堆中所有引用计数为零的对象,回收内存并整理堆中的碎片. 
    所以堆中的对象不会一直存在,垃圾回收器会选择一个最佳时机去销毁它。