namespace ConsoleApplication1
{
    class MyClass
    {
        public SqlConnection sqlCon = new SqlConnection();
        public void Fun()
        {
            SqlConnection sqlCon2 = new SqlConnection();
        }
        
    }    class Program
    {
        
        static void Main(string[] args)
        {
            MyClass myObj = new MyClass();
            myObj.Fun();
            Console.WriteLine("OK");
        }
    }
我关于这个程序的解释大家看看对吗?  
Main程序入口,在stack中压入Main的函数指令和参数, 然后myObj引用在stack里创建,指向heap里的对象。
调用myobj.Fun,在stack中压入Fun相关信息,然后执行Fun,然后在stack中创建引用sqlCon2,而sqlCon2指向的对象也存在于stack中,退出栈时,sqlCon2会自动消失吗?这就是我的主要问题。 因为数据库连接是非托管的,我没有Dispose,它会因为自己出栈,而消失吗? 所以不用去管这个sqlCon2吗? 当然sqlCon1是一定要dispose的

解决方案 »

  1.   

    对不起 我懂了 sqlCon2必须手动释放。。 因为只要是对象 就一定是在堆里, 我失误了。 只有值类型的和指针(引用)才可能在堆里或者在栈里。
      

  2.   

    这句好像不对吧。
    引用sqlCon2在栈上,没问题;但是sqlCon2指向的对象是用new创建的,new的不是都在heap吗?
      

  3.   

    而sqlCon2指向的对象也存在于stack中
    ==
    sqlCon2指向的对象存在于heap中
      

  4.   

    sqlCon2必须调用它的Close方法释放非托管的连接资源,CLR只会自动管理托管的内存资源。占有的非托管资源,不管是对象分配在堆里还是栈里,都要手工释放。
      

  5.   

    对象应该是在stack上,而存储空间应该指向heap。
      

  6.   

    [讨论]
    在从main进入之前,clr会先加载入口函数所在程序集,加载编译Program类并分配内存,在编译到声明MyClass的对象时,会先加载MyClass所在程序集(这里应该是跟Program在同一程序集里),加载编译MyClass类并分配内存,再给MyClass声明的对象分配内存
      

  7.   

    我觉得是这样,不对的请指出!public void Fun()
            {
                SqlConnection sqlCon2 = new SqlConnection();
            }//运行到此句,sqlCon2将被自动释放
    static void Main(string[] args)
            {
                MyClass myObj = new MyClass();
                myObj.Fun();
                Console.WriteLine("OK");
            } //运行到此句,myObj及它的成员将被自动释放或者这个代码写成这样更明了点
    public class MyClass
    {
    public static void Main()
    {
    A a=new A();
    a.fun();
    }
    }
    public class A
    {
    public object a=new object();
    public void fun()
    {
        object aa=new object();
    }
    }