跟蹤句柄類似於本地C++指針,但也有明顯不同的地方。跟蹤句柄確實存儲著某個地址,如果堆壓縮過程中移動了句柄引用的對象,垃圾回收器將自動更新句柄包含的地址。但是,我們不能像使用本地指針那樣使用跟蹤句柄執行地址的算術操作,跟蹤句柄的強制類型轉換也是不允許的。
與標準C++可以自己維護堆不同,因為C++/CLI中動態分配的記憶體是由CLR來維護的,當不需要堆時,CLR自動將其刪除並回收,同時自動壓縮記憶體堆以免產生不必要的記憶體碎片。由於這種垃圾回收機制會改變堆中對象的地址,如果使用指針,則指針將不再有效,因此不能在CLR堆中使用普通C++指針。為此,CLR提供了跟蹤句柄和跟蹤引用,從而安全地訪問堆中對象。
在聲明一個跟蹤句柄時,可以將符號 “^” 添加到類型名稱後面用於指定該類型的句柄變數。當聲明某個句柄時,系統會自動將該句柄初始化為空值,以表示該句柄未引用任何對象。例如:
String^ name; //聲明名稱為name的String類型的句柄,初始值為空
String^ word = nullptr;//聲明名稱為word的句柄,並顯式初始化為空(關鍵字nullptr顯式地將跟蹤句柄初始化為空值)
String^ saying = L"Hello world!";//聲明名稱為saying的句柄,並指定了初始化值