天天看點

OSG:3.記憶體管理

Geode 類也就是 OSG 的葉節點,它包含了用于渲染的幾何資訊;Group 節點可以有多個子節點,這兩個類均派生自Referenced類。

兩種建立方式;

1.使用模闆ref_ptr<>

// 建立新的 osg::Geode 對象。将其賦予 ref_ptr<>, 

 // 同時将引用計數器加一。 

 osg::ref_ptr<Geode> geode = new osg::Geode; 

 // 假設 grp是指向一個 osg::Group 節點的指針。 

 // Group也使用 ref_ptr<>指向其子節點, 

 // 是以 addChild()将再次把引用計數器加一,此時其值為 2。 

 grp->addChild( geode.get() ); 

// ref_ptr<>變量 geode 已經超過了其有效範圍,

// 此時把引用計數器減一,其值為 1。 

這個示例中,其實并沒有使用ref_ptr<>的必要,因為程式本身不需要長時間儲存 geode 這個指針。事實上,在上述的簡單例子中,ref_ptr<>僅僅是增加了變

量構造過程中無用的開支。這裡使用簡單的C++指針就已經足夠了,因為父節點osg::Group内部的 ref_ptr<>已經可以負責管理新的osg::Geode 所占用的記憶體了。

2.使用C++标準指針建立

// 建構新的 osg::Geode 對象,不必增加其引用計數的值。 

osg::Geode* geode = new osg::Geode; 

// Group内部的 ref_ptr<>将會把子節點 Geode 的引用計數值置為 1。 

grp->addChild( geode ); 

當使用标準 C++指針指向 Referenced 對象時要特别注意,為了保證 OSG 的記憶體管理系統正常工作,Referenced對象的位址必須賦予一個ref_ptr<>變量。上

述的代碼中, 這一指派過程在 osg::Group::addChild()方法中實作。 如果 Referenced對象從未配置設定給一個 ref_ptr<>變量,那麼這将會引發記憶體洩露。

你不能夠顯式地釋放派生自 Referenced的對象,也不能在堆棧中建構它。

ref_ptr<>類型的變量隻能夠指向派生自 Referenced 的對象,或者與Referenced類有相同接口的對象。

下面的代碼并不會引發記憶體洩露: 

 // top使得 Group節點的引用計數置 1。 

 osg::ref_ptr<Group> top = new osg::Group; 

 // addChild()使得 Geode 節點的引用計數置 1。 

 top->addChild( new osg::Geode ); 

}

繼續閱讀