跟踪句柄类似于本地C++指针,但也有明显不同的地方。跟踪句柄确实存储着某个地址,如果堆压缩过程中移动了句柄引用的对象,垃圾回收器将自动更新句柄包含的地址。但是,我们不能像使用本地指针那样使用跟踪句柄执行地址的算术操作,跟踪句柄的
强制类型转换也是不允许的。
与标准
C++可以自己维护堆不同,因为C++/CLI中动态分配的内存是由CLR来维护的,当不需要堆时,
CLR自动将其删除并回收,同时自动压缩内存堆以免产生不必要的
内存碎片。由于这种垃圾回收机制会改变堆中对象的地址,如果使用
指针,则指针将不再有效,因此不能在CLR堆中使用普通C++
指针。为此,
CLR提供了跟踪句柄和跟踪引用,从而安全地访问堆中对象。
在声明一个跟踪句柄时,可以将符号 “^” 添加到类型名称后面用于指定该类型的句柄
变量。当声明某个句柄时,系统会自动将该句柄初始化为空值,以表示该句柄未引用任何对象。例如: