查看: 1763|回复: 4

如何手动释放内存

[复制链接]

该用户从未签到

发表于 2011-5-11 12:06:36 | 显示全部楼层 |阅读模式
问题:超级指针在程序结束的时候会释放所有的内存,那么在OSG运行的过程中如何手动释放不再使用的内存呢?,看下面例子
//先利用超级指针申请一些内存
osg::ref_ptr<osg::Group > root = new osg::Group;
osg::ref_ptr<osg::Group> group = new osg::Group;
osg::ref_ptr<osg::Group> matrix = new osg::Group;
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
root->addChild(group);
viewer->setSceneData(root.get());
while(!(viewer->done()))
{
    if(条件1)
        viewer->frame();
    if(条件2)
    {
        root->removeChild(group);
        group.release();
        viewer->frame();
    }
}
但是group.release()这条语句并没有如我认为的那样会将group占用的内存资源释放掉。
请教各位,当场景渲染到一定时候,有些场景不想渲染了,如何释放这些场景所占用的内存呢?

该用户从未签到

发表于 2011-5-11 15:43:12 | 显示全部楼层
  1. group.release();
复制代码
这里您的应用非常危险,因为还有别的节点引用group,这里突然把它的引用计数降为0,其后果是灾难性的。

释放某个子节点非常简单,只要它所有的父节点都removeChild就行了。只要不再有节点引用它,这个节点将自动被释放

该用户从未签到

发表于 2011-5-11 18:04:18 | 显示全部楼层
只要确保所有引用的地方都group=NULL了自然就释放了,否则你释放了也是危险的

该用户从未签到

 楼主| 发表于 2011-5-11 21:47:07 | 显示全部楼层
回复 2# array


    在程序中,group的父节点只有root一个,没有其他节点引用group节点,而group节点下面挂了好几个子节点用来读ive格式模型。当运行到一定时候,想释放这些ive模型占用的内存资源,但是使用root->removeChild(group)后,打开任务管理器发现内存使用并没有减少,这是为什么呢?

该用户从未签到

发表于 2011-5-12 08:44:11 | 显示全部楼层
但是使用root->removeChild(group)后,打开任务管理器发现内存使用并没有减少
简单来看,您的判断方法似乎很不准确;如果您想确认节点是不是真的被删除了,可以重写它的析构函数,或者使用Observer来观察
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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