智能指針自動地增加和減少它指向對象的引用計數,從而應用程序不在直接調用NiRefOjbect的引用計數函數。例如在函數中如果聲明一個局部智能指針變量並指向對象A,那麼對象A的引用技術在賦值的時候將會增加1。當函數返回的時候,這個局部的智能指針被摧毀(超出了作用域),對象A 的引用計數將會減少1。
約定俗成,每個從NiRefObject派生的Gameroy類都有一個方便的智能指針聲明,它表現在類型名稱上加“Ptr”(NiNodePtr、NiTriShapePtr等)。
NiNodePtr spParent = <some node>;
NiNodePtr spChild = NiNew NiNode;
//spChild points to new object. Reference count is 1.
spParent->AttachChild(spChild);
//Reference count of object pointed to by spChild is now 2, since NiNode objects use smart pointers to refer their children.
spParent->DetachChild(spChild);
//Reference count of object pointed to by spChild decreases to 1.
spChild = 0;
//Reference count of object decreases to 0. Object is deleted.
那麼不論這個智能指針指向的指針對象的引用計數是多少,該對象都會被刪除。如果想釋放一個智能指針對指向對象的引用(在智能指針因超出作用域被摧毀之前),將智能指針賦值爲0即可。這樣確保對象引用計數減少到0的時候摧毀,類似的永遠不要對一個NiRefObject對象指針作delete操作,這將也會永久摧毀這個對象。
爲了區別指針和智能指針,Gamebryo對常規指針使用“pk”前綴,對智能指針使用“sp”前綴
2 傳輸pkObject到一個智能指針參數,編譯器隱式調用智能指針的構造函數將pkObject轉換到一個臨時的智能指針,並將對象的引用計數增加到1。
3 在函數調用的作用域,這個臨時智能指針通過調用智能指針的拷貝構造函數複製到一個局部智能指針中,並將對象的引用計數增加到2。
4 當函數調用返回的時候,局部智能指針被摧毀,並將對象的引用計數減少到1。
5 在調用完成的時候,臨時智能指針對象也被摧毀,並將對象的引用計數減少到0,這導致對象被釋放掉。
NiSmartPointer(NiNode)
類型轉換宏是NiSmartPointerCast(classname, pkObject)。如下是典型的使用:
NiAVObjectPtr spChild = <some pointer known to be an NiNode>;
NiNodePtr spNode = NiSmartPointerCast(NiNode, spChild);
注意類型轉換時操作是靜態的不是動態的,所以我們應當在知道要轉換的指針是正確的類型的時候使用NiSmartPointerCast