- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
OSG的内存管理
当应用程序不再使用场景图形时,每个节点所使用的内存需要释放以避免内存泄露。如果要编写代码遍历整个场景图形,并依次删除所有的节点及其数据,那么这项工作将是巨大且容易出错的。 OSG 使用智能指针模板类来解决着一个问题: 所有继承自Reference类的对象都可以作为类型变量ref_ptr的模板参数。 OSG 节点和场景图形均继承自Reference类,比如一个根节点。假如root是Refernce类的派生类,则下面的代码定义了一个智能指针ptrroot: ref_ptrroot ptrroot= new root; 一个私有指针_ptr,用于保存管理内存区域的地址。可以用 get()方法返回_ptr 的值。 为了使 ref_ptr可以像正常的 C++指针一样工作,重载或定义了一些方法,如 operator-()和 operator=()。 valid()方法用于判断 ref_ptr是否为空,不为 NULL 时返回 TRUE。 #include Geode #include Group #include ref_ptr ... { // 创建新的 osg::Geode 对象。将其赋予 ref_ptr, // 同时将引用计数器加一。 osg::ref_ptrGeode geode = new osg::Geode; // 假设 grp 是指向一个 osg::Group 节点的指针。 // Group 也使用 ref_ptr指向其子节点, 因此 // addChild()将再次把引用计数器加一,此时其值为 2。 grp-addChild( geode.get() ); } // ref_ptr变量 geode 已经超过了其有效范围, // 此时把引用计数器减一,其值为 1。 几点说明 不能够显式地释放派生自Referenced 的对象,也不能在堆栈中构建它。下面的代码将会产生错误 osg::Geode* geode1 = new osg::Geode; delete geode1; { // 此处将产生编译错误 : 析构函数为保护成员 osg::Geode geode2; } // 此处将产生编译错误:析构函数为保护成员 几点说明(续) ref_ptr 类型的变量只能指向派生自Referenced 的对象。下面的语句是对的: osg::ref_ptrGeode geode = new osg::Geode; // 因为Geode 派生自Referenced //下面的代码是错的 int i; osg::ref_ptrint rpi = i; 小节 所有场景数据的保存都用智能指针,不要用delete。 * 一个典型的应用程序使用一个指针来保存根节点的地址, 从而引用(reference)整个场景图形。应用程序并不保存场景图形中其它节点的指针。其它所有的节点,均通过根节点直接或者间接地被引用。
文档评论(0)