查看: 1534|回复: 7

内存泄露

[复制链接]

该用户从未签到

发表于 2009-9-4 18:15:50 | 显示全部楼层 |阅读模式
我想动态的删除一个osg节点,但是不能用delete删除,因为析构是保护成员,但是节点下面的东西大了,如果不删除,每次从组节点移除后会出现内存不断的泄露,应该怎么清理这些内存呢?
改用ref_ptr也不行。

我是从文件中进行加载,然后删除的,再次加载,再删除,发现每次都有6M多的内存泄露

该用户从未签到

发表于 2009-9-4 18:34:34 | 显示全部楼层
贴一点关键的代码看看.

该用户从未签到

 楼主| 发表于 2009-9-4 20:09:00 | 显示全部楼层
是这样的,我有一个总的组节点root,下面有画点的point,线的line,面的plane,(只是简写,具体的比较复杂,我的机器不能上网),在画点的point,线的line,面的plane又存在许多的子节点和状态。这些节点信息我都是从文件中读出来再进行加载的,root节点是一直存在的。
我从root节点下removechild那三个节点进行删除操作,然后又再次加载,再删除,我发现每次加载删除都存在6m左右的内存增长,把那三个节点换成ref_ptr也不行。
是不是要进行遍历把画点的point,线的line,面的plane节点的子节点remove后才不产生内存泄露呢?

该用户从未签到

发表于 2009-9-4 21:50:16 | 显示全部楼层
removeChild不会有任何问题,将自动析构不再被引用的节点,您需要检查自己的代码。可以打印一下节点的referenceCount(),看看是不是别的地方还引用了被删除的节点

该用户从未签到

 楼主| 发表于 2009-9-4 22:23:12 | 显示全部楼层
谢谢array,
removeChild删除节点会遍历删除该节点的子节点吗?

该用户从未签到

发表于 2009-9-4 22:38:14 | 显示全部楼层
只要节点不再被别的地方引用,那么removeChild将产生连锁反应,删除整个子节点树

该用户从未签到

发表于 2009-9-4 23:41:32 | 显示全部楼层
按理说删除了父节点下面的子节点自动删除的,要不做个循环获取每个子节点删除看看。要不就是像array说得那样,有地方还使用了他们!

该用户从未签到

发表于 2009-9-5 21:08:18 | 显示全部楼层
其实安全起见,你这样删除比较保险
以Point节点为例,找出point节点的所有父节点 pParentlist = point->getParents()
然后遍历所有的父节点,删除其下面的每一个point节点即可以保证 该point的refcount为0.  如果还有内存泄漏,应该是在程序里面用New 分配了一些其他的状态和其他变量的原因。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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