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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值