我在A类中以app声明了非托管的一个对象 然后在dispose中如何释放他 直接app=null? 还是其他的
如果未释放会怎么样 关闭程序后仍然在内存中存在吗?

解决方案 »

  1.   

    Finalize的目的是用于释放非托管的资源,而Dispose是用于释放所有资源,包括托管的和非托管的。  
    非托管对象实现IDisposable接口在Dispose方法中清理,托管对象不需要清理
    GC.SuppressFinalize
      

  2.   

    非托管对象需要自己提供释放的API,Close,Dispose之类的方法.
    如果不释放,可能会有内存泄露(memory leak)
      

  3.   


    晕 那岂不是很麻烦  我又没学过C++ 怎么提供API之类的啊
      

  4.   

    对于.Net本身提供的实现System.IDisposable接口的类,用完之后(不在需要时),立即调用它的Dispose方法就行了.
      

  5.   

    回楼上
    我说的不是释放.NET的对象 而是非托管的对象请再看下题:
      

  6.   

    只要不是你自己弄进来的非托管资源,比如.Net自身提供(由设计.Net的人弄进来的)的,除了NotifyIcon必须显式释放外,别的几乎都会在程序退出时自动释放.有些对象,需要在使用过程中根据需要释放,比如FileStream,互斥器,各种Pen,Font等.
      

  7.   

    就是我自己引进的非托管资源
    这么说吧 我引用了一个COM组件 叫Excel Object Lib 
    里面有一个Application类 我在托管代码中实例化了它  在程序结束前把他的引用设为了NULL 就是一楼所说的app=null  
    在程序结束后这个对象还在内存中存在吗?  我这个程序每天要运行多次 如果不释放内存 对系统损失太大
      

  8.   

    COM组件有它自己的释放方法,比如Excel.Application类的Quit方法.这些需要编写代码释放,如果不释放的话,程序结束后,还在内存中(而且是个进程)
      

  9.   

            public void Dispose()
            {
                this.Dispose(true);
            }        ~ExamQuestion()
            {
                this.Dispose(false);
            }        protected virtual void Dispose(bool disposing)
            {
                if (disposing)
                {
                    //释放托管资源
                }
                //释放非托管资源
                //这不是典型的清理模式吗?  关键是这里的代码写什么?
            }
      

  10.   


    哦 那我就明白了 就是不同的COM组件都有不同的清理函数是吧 
    谢谢你了