转自酷网动力(www.ASPCOOL.COM)
在清闲之余,在此与大家探讨一下,C++/CLI中的资源清理。本文将分成三部分,他们分别是引言、Destructor,Finalizer的语法表示、如何保证Destructor,Finalizer与其他语言兼容。
一、 引言
资源是一个很大的范畴,先让我确定一下我们这里谈论的资源包括哪些内容。这里专指在面向对象编程中一个对象实例所使用的资源,他包括对象本身所占有的内存(对象占有内存的大小由对象字段成员来决定,字段成员越多占有的内存就越大)以及其字段成员(Field member)所使用的资源,如文件句柄,数据库链接等等。相信大家比我到清楚在一个对象不再被使用时应该释放其占有的资源,在清理对象所占有的内存之前,执行一个特定的函数,释放字段成员所使用的资源。比如一个文件对象,我们在delete之前得调用Close函数。C++/CLI中的析构器(Destructor)、终结器(Finanlizer)便扮演这个特定函数的角色。在探讨这两个函数之前我们先回忆一下与C++/CLI有着一定关系的ISO C++与.NET平台(ISO C++是他的前辈,并且C++/CLI对ISO C++是兼容的,他们的兼容性已超出本文范围,我们可以在往后再一起讨论;.NET平台是C++/CLI的运行平台),看看他们俩是如何完成资源清理的,这样能够帮助我们更好地理解C++/CLI中的资源清理。
ISO C++面对的是无虚拟机环境,直接根操作系统或是硬件打交道,资源的回收必须由程序员完成,即在某个对象不再使用时得手动地进行资源释放。如果是栈对象则在超出作用域时会自动调用析构器,同时释放对象自己所占有的内存;若是堆对象,只有程序员使用delete pointer 时才会调用pointer所指向对象的析构器,接着释放pointer所指向对象的内存。
.NET平台的一个主要特点是,托管内存,内存的回收交给垃圾回收器(GC)来管理。它会检测到哪些对象不再被使用,便回收其所占用的内存。如果该对象所属的类型实现了Finalize()函数,则会在回收内存之前调用该函数。Finalize函数的作用与ISO C++中的析构器作用类似,在对象被销毁之前释放其字段成员使用的其他资源。
比较一下ISO C++与.NET平台的资源清理,我们不难发现,ISO C++的资源清理是手动的