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