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 );
}