OpenSceneGraph:智能指针


1. 从只能指针中获取原始指针的方法有:

  osg::ref_ptr<osg::Geode> geodePtr = new osg::Geode();

  osg::Geode* obj1 = *geodePtr;       //获取Geode指针

  osg::Geode* obj2 = geodePtr.get(); //获取Geode指针

2.下面代码存在性能问题

  while(1)
  {
    osg::ref_ptr<osg::Geode> geodePtr = new osg::Geode ;
  }
  智能指针只存在while循环中因此每次循坏都会反复将新分配的对象地址传入智能指针,然后ref_ptr对象析构时引用计数归0,
    Geode对象被析构,最终并不会产生内存泄露,但会引起效率问题。
3. 每一个OSG场景对象都维护一个或数个ref_ptr类型的成员变量,因此下面两种操作Geode对象都可以:
  //假设已经存在geodeParent父对象
  osg::ref_ptr<osg::Geode> geodePtr = new osg::Geode;

  geodeParent->setGeode(geodePtr);
  //或者
  osg::Geode* geodePtr = new osg::Geode;
  geodeParent->setGeode(geodePtr);

  另一个需要特别注意的是ref_ptr作为函数返回值的传递时:
  osg::Geode*  createGeode()
  {
    osg::ref_ptr<osg::Geode> geode = new osg::Geode;
    //下面做法为错误的
    //return geode.get();
    //正确做法
    return geode.release();
  }

  用get()时,当函数体结束时,ref_ptr对象析构同时使geode对象引用计数归零,使得geode对象被析构
  导致返回的指针地址无效。正确做法使用release(),即将引用对象实例输出,同时引用计数归0,但不释放。
4. 综上, 使用ref_ptr的几条规则:
  1. OSG中新创建的场景对象建议使用ref_ptr进行内存的管理;

  2. 对于不使用ref_ptr的对象,引用计数值无意义,无法自动从场景对象中卸载;

       3.  新建对象最为函数结果返回时,建议使用release()传递,并将返回值引入ref_ptr自动管理。

    

转自:https://www.cnblogs.com/hzhg/archive/2011/12/30/1908726.html

和 OpenSceneGraph三维渲染引擎设计与实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值