zoukankan      html  css  js  c++  java
  • C# 托管资源 与 非托管资源

    C# 托管资源 与 非托管资源

    托管资源一般是指被CLR控制的内存资源,这些资源的管理可以由CLR来控制,.NET可以自动进行回收,主要是指托管堆上分配的内存资源。例如程序中分配的对象,作用域内的变量等

    非托管资源:不受CLR控制和管理的资源,比如文件流,数据库的连接,网络连接,系统的窗口句柄,打印机资源等,可以认为操作系统资源的一组API。这类资源一般不存在于Heap(堆,内存中用于存储对象实例的地方)中。
    .Net平台中,CLR为程序员提供了一种很好的内存管理机制,使得程序员在编写代码时不需要显式的去释放自己使用的内存资源(这些在先前C和C++中是需要程序员自己去显式的释放的)。这种管理机制称为GC(garbage collection)。GC的作用是很明显的,当系统内存资源匮乏时,它就会被激发,然后自动的去释放那些没有被使用的托管资源(也就是程序员没有显式释放的对象)。
    但是,CLR的GC功能也只能释放托管资源,对于非托管资源例如窗口,文件和网络连接等,它都只能跟踪非托管资源的生存期,而不知道如何去释放它。这样就会出现当资源用尽时就不能提供资源能够提供的服务,windows的运行速度就会变慢。这样的情况会出现在数据库的连接当中,当你没有显式的释放一个数据库资源时,如果还是不断的申请数据库资源,那么到一定时候程序就会抛出一个异常。
    在.NET的对象中实际上有两个用于释放资源的函数:Dispose和Finalize。Finalize的目的是用于释放非托管的资源,而Dispose是用于释放所有资源,包括托管的和非托管的。
    MSDN建议按照下面的模式实现IDisposable接口:

    public class Foo: IDisposable
     {
         private bool disposed=false;
         //既释放托管资源,又释放非托管资源
         public void Dispose()
         {
            Dispose(true);
    
            //将对象从垃圾回收器链表中移除,      
            //从而在垃圾回收器工作时,只回收托管资源,而不执行对象的析构函数
            GC.SuppressFinalize(this);
         }
    
         protected virtual void Dispose(bool disposing)
         {
            if (!disposed)
            {
                if (disposing)
                {
                   //释放托管资源
                }
                // 释放非托管资源
                disposed = true;
            }
         }
    
         //析构函数不是人工调用,由垃圾回收器调用,用于释放非托管资源
         ~Foo()
         {
            Dispose(false);
         }
     }

    原文:http://blog.csdn.net/bingkxin/article/details/50912279

  • 相关阅读:
    Win10下访问linux的ext4分区文件并拷贝
    Zsh 无法找到自己的anaconda python
    Motrix 代替迅雷下载 aria2的配置
    Bash与python混合编程
    如何在 非系统盘安装 wsl
    Python_01
    CC2541蓝牙学习——通用I/O口中断
    自定义弹窗
    使用windbg搜索命令辅助逆向杀软穿透驱动注册表操作
    IAT Hook
  • 原文地址:https://www.cnblogs.com/gaobing/p/6829598.html
Copyright © 2011-2022 走看看