4.6 C++(www.cppentry.com)/CLI编程(www.cppentry.com)
CLR的动态内存分配以不同的方式工作,CLR维护其独立于本地C++(www.cppentry.com)堆的内存堆。当我们不再需要在CLR堆上分配的内存时,CLR会自动将其删除。因此,我们不必在为CLR编写的程序中使用delete运算符。CLR还可以压缩内存堆,以避免不时产生的碎片。这样,CLR就消除了出现内存泄漏和内存碎片的可能性。CLR提供的堆管理和整理机制被称作垃圾回收(garbage collection)-- 垃圾即被抛弃的变量和对象,CLR管理的堆被称为可回收垃圾的堆(garbage-collected heap)。在C++(www.cppentry.com)/CLI程序中,使用gcnew运算符而非new运算符分配内存。前缀gc表明,我们是在可回收垃圾的堆上分配内存,而不是在一切整理工作都要编程(www.cppentry.com)人员负责的本地C++(www.cppentry.com)堆上。
CLR的垃圾回收器能够将不再需要的对象删除,并释放它们所占用的内存。垃圾回收器如何知道何时不再需要堆上的某个对象?答案非常简单,CLR记录着每个引用堆内对象的变量,如果所有变量都不包含某个对象的地址,则该对象就不可能在程序中再次被引用,因此可以将其删除。
因为垃圾回收过程可能需要压缩堆的内存区域,以消除零碎的未用内存块,所以存储在堆内的数据项的地址有可能改变。因此,我们不能在可回收垃圾的堆中使用普通的本地C++(www.cppentry.com)指针,因为如果指向的数据的位置发生变化,则该指针将不再有效。我们需要的访问堆内对象的方法是,应该在垃圾回收器重新安排堆内数据项的位置时,能够更新相应的地址。在CLR程序中有两种方法可以提供这种功能:类似于本地C++(www.cppentry.com)指针的跟踪句柄(亦简称为句柄)和等价于本地C++(www.cppentry.com)引用的跟踪引用。