指针篇
今天看了一点关于指针的东西,颇有感触
首先,我们需要了解两个概念,一个是托管资源,一个非委托资源。
a.其中托管资源一般是指被CLR控制的内存资源,这些资源的管理可以由CLR来控制,例如程序中分配的对象,作用域内的变量等。
b.而非托管资源是CLR不能控制或者管理的部分,这些资源有很多,比如文件流,数据库的连接,系统的窗口句柄,打印机资源等等……这些资源一般情况下不存在于Heap(内存中用于存储对象实例的地方)中。
注:CLR的GC功能也只能释放托管资源,对于非托管资源例如窗口,文件和网络连接等,它都只能跟踪非托管资源的生存期,而不知道如何去释放它。这样就会出现当资源用尽时就不能提供资源能够提供的服务,windows的运行速度就会变慢。这样的情况会出现在数据库的连接当中,当你没有显式的释放一个数据库资源时,如果还是不断的申请数据库资源,那么到一定时候程序就会抛出一个异常。所以,当我们在类中封装了对非托管资源的操作时,我们就需要显式,或者是隐式的释放这些资源。而Finalize和Dispose方法分别就是隐式和显式操作中分别使用到的方法。
对于.NET Framework 来说,提供三种指针:托管指针(Managed pointers),未托管指针(Unmanaged pointers),和未托管函数指针(unmanaged function pionters).
托管指针:是.NET Framework 架构下的新类型指针,它通过内存的堆(Heap)做管理,亦称为托管对象的句柄(Handle)。公共语言运行时(CLR)具有内存自动回收的机制,指的就是托管指针。一般来说,托管指针以传址方式传递自变量。对于Visual C++ 2008 来说,托管指针表示方法为“^”.
未托管指针:指的就是传统的C++指针。由于C++程序语言本身的默认值就是未托管程序代码,换句话说,并未涵盖在公共语言规范(CLS)中。
未托管函数指针:以传统C++指针来提供来提供函数地址,通过CLS的委派方式来改良原有的函数指针。
对于这三种指针平时很少涉及,还需多多揣度。
2010-05-23 00:16:28