OSG智慧型指標 osg ref ptr

2021-10-02 15:50:39 字數 1618 閱讀 9772

在osg開發時(特別是剛上手),有一點比較重要然後容易忽略的是,在osg程式開發中,要盡量使用osg::ref_ptr。

這個智慧型指標構建起osg的物件樹(絕大部分osg類都是繼承於osg::referenced,即可計數物件),類似於qt的物件樹,負責其記憶體的管理。

當然其記憶體管理策略不是我們關心的,我們使用它的原因是基於其記憶體管理策略,大部分類的析構函式都是受保護的,意味著我們並不能直接維持物件的記憶體,就必須用到osg::ref_ptr(當然這個必須是相對的,舉個例子,如果我們new了乙個osg::node,然後把它addchild()進mapnode,那當removechild的時候,這塊記憶體其實也是會被釋放掉的。但這責任分配很奇怪不是嗎?)根據部分教材的說法:

這種時候就必須由我們來負責記憶體釋放,而這是必須通過osg::ref_ptr完成。

至於我們怎麼釋放?很簡單,舉例:osg::ref_ptrmynode;

直接mynode = nullptr;這塊記憶體就會被釋放(基於計數原則),同時把mynode reset為空。

osg::ref_ptr本身非常簡單,除了上面所說基本沒有其他內容(而正是基於這麼簡單的內容就構建起整個記憶體管理系統)。有乙個小地方可能比較引人注目,就是osg::ref_ptr::release(),這個函式的名字非常讓人迷惑,但是相信我,基本上用不到這個函式的。根據官方的注釋:

和具體實現:

重點在於「local」,經過實驗,它唯一會使用到的地方就是類似於下面的**:

#include

#include

#include

#include

#include

#include

#include

osg::geometry *

creategeometry()

;int

main()

osg::geometry *

creategeometry()

//定義顏色陣列

//定義法線

//設定頂點關聯方式

geom-

>

addprimitiveset

(new osg::

drawarrays

( osg::primitiveset::quads,0,

4));

return geom.

release()

;}

也就是注釋中的,區域性的osg::ref_ptr,以及必須返回c風格的指標(而不是ref_ptr)。稍微解釋一下,因為這種情況下creategemoetry域返回時就是呼叫geom的析構函式,這個時候就會導致引用數為0,即釋放掉geom的記憶體,即使返回了geom的指標,也只會是野指標,所以必須返回gemo.release。

總結,總之用到osg相關的,加上osg::ref_ptr就對了。(當然說是智慧型指標,最終記憶體還是要自己管理,謹慎小心!)原本沒用到的也不是一定要改,只是不好而不是不能用。

智慧型指標 強弱智慧型指標

在平時編寫 的時候經常會用到new來開闢空間,而我們開闢出來的空間必須得手動去delete他,但是如果程式設計師忘記去手動釋放那邊會出現乙個麻煩的問題,記憶體洩漏!或者是一塊記憶體被多個函式同時使用時,如果其中乙個函式不知道還有其他人也在使用這塊記憶體而釋放掉的話同樣也會引起程式的崩潰。引起記憶體洩...

智慧型指標學習

最近接觸到智慧型指標很多,於是研究了一下智慧型指標的原理,寫下自己的心得體會,有不對的還請指正。智慧型指標產生的目的 因為在c 中,存在非常複雜的指標錯誤問題,例如,某個物件生成後,指向該物件的指標可能有多個,當我們用delete語句刪除其中的乙個指標後,物件就被銷毀,那麼其餘指向該物件的指標就會懸...

智慧型指標3

include include using namespace std define test smartptr class stub class sentry sentry private int lock template class refcountingtraits void unrefer...