OpenSceneGraph内存管理--ref_ptr<T>(续)

之前转过一篇关于OSG中ref_ptr管理内存的文章,现再自己补充一些。
  
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自动管理。

~~~~~~~~~~~~~~~~~~~~~~~~OVER~~~~~~~~~~~~~~~~~~~~~~~~~

posted @ 2010-12-16 23:58  adyzng  阅读(2599)  评论(1编辑  收藏  举报