查看: 1871|回复: 4

Node的删除

[复制链接]

该用户从未签到

发表于 2009-2-17 16:16:54 | 显示全部楼层 |阅读模式
把一个node彻底的从内存中删除 我给怎么做?Group->removeChild(*node)这句话好像并没有把node从内存中删除

该用户从未签到

发表于 2009-2-17 16:36:28 | 显示全部楼层
OSG使用内存引用计数的管理机制。对于使用ref_ptr管理的节点,每当一个ref_ptr引用它的时候(例如父节点执行addChild),都会使它的引用计数加一;而ref_ptr超出自身生命周期,以及节点的removeChild等操作都会使引用计数减一,当所有的ref_ptr都不再引用它时,它的引用计数为0,则自动予以释放。因此,诸如:
  1. while (1) { osg::ref_ptr<osg::Group> group = new osg::Group; }
复制代码
并不会产生内存泄露,而
  1. osg::ref_ptr<osg::Group> group = new osg::Group;
  2. node1->addChild( group.get() );
  3. node2->addChild( group.get() );
  4. node1->removeChild( group.get() );
复制代码
则不会从内存中卸载这个节点,因为引用计数还未到0。具体可以参看PaulMartz的《OSG快速入门指导》等书

[ 本帖最后由 array 于 2009-2-17 16:44 编辑 ]

该用户从未签到

 楼主| 发表于 2009-2-17 16:56:45 | 显示全部楼层
是那样 ,如果我这样做了
osg::ref_ptr<osg::Group> group = new osg::Group;
node1->addChild( group.get() );
node2->addChild( group.get() );
node1->removeChild( group.get() );
我现在想把group给从内存中删除我该怎么做?

该用户从未签到

发表于 2009-2-17 17:08:26 | 显示全部楼层
当然是
node2->removeChild( group.get() );
以保证所有引用了group的节点都将其删除,此时group会自动释放,不需要手动delete

该用户从未签到

 楼主| 发表于 2009-2-17 17:10:00 | 显示全部楼层
我明白了 刚才看错了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表