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