查看: 1703|回复: 13

帮忙看这段有问题么??

[复制链接]

该用户从未签到

发表于 2009-8-13 12:45:35 | 显示全部楼层 |阅读模式
///回调
class UpdateCallBack : public osg::NodeCallback
{
public:
        UpdateCallBack(osg::Group *root)
        {
        }
        virtual void operator()(osg::Node *node,osg::NodeVisitor *nv)
        {
                osg::Group *root = dynamic_cast<osg::Group *>(node);
                //root->setDataVariance(osg::Object:YNAMIC);
                if(root)
                {
                        root->removeChild(root);
                }
            traverse(node,nv);
        }

};

///mRootInit
    mRoot  = new osg::Group;
    mRoot.get()->setUpdateCallback(new UpdateCallBack(mRoot.get()));
    mRoot->setDataVariance(osg::Object::DYNAMIC);

////Btn下调用
    go->mRoot->removeChild(go->mRoot.get()->getChild(2));

该用户从未签到

 楼主| 发表于 2009-8-13 12:47:03 | 显示全部楼层
删除getchild(2)之后还能继续删除root上的子节点。。直到root没节点就弹出内存泄露的对话框
怎么解决这个 。。。

该用户从未签到

发表于 2009-8-13 13:40:50 | 显示全部楼层
root->removeChild(root);
这句话您确信写对了?

还有那句“Btn下调用”的代码多半会有问题,就算设置了DYNAMIC也没用。OSG是多线程方式运行渲染的,所有与场景管理有关的动作都尽量放在仿真循环中完成。因此建议在“Btn调用”时改变一个标志量,然后据此来更改场景中的内容

该用户从未签到

 楼主| 发表于 2009-8-13 13:56:21 | 显示全部楼层
root->removeChild(***);
参数应该怎么写?

该用户从未签到

发表于 2009-8-13 14:31:45 | 显示全部楼层
removeChild删除指定的子节点对象;removeChildren删除指定位置的一个或多个子节点

该用户从未签到

 楼主| 发表于 2009-8-13 14:34:23 | 显示全部楼层
所有的场景节点都绑定到mRoot上边  跟新绑定到mRoot上 传进去mRoot和一个Index索引
btn控制删除哪个索引 根据索引删除对应的节点。。。这是我的思路

该用户从未签到

 楼主| 发表于 2009-8-13 14:47:01 | 显示全部楼层
if(g_Temp == 1)
  root->removeChild(root->getchild(1));

.//////////////////////btn下边
g_Temp =1;
为什么老师提示内存泄露啊

该用户从未签到

发表于 2009-8-13 15:06:16 | 显示全部楼层
这两段不会引起内存泄露,可能只是误报,或者您需要检查其他地方的代码

该用户从未签到

 楼主| 发表于 2009-8-13 15:41:53 | 显示全部楼层
误报??不可能吧  看之前有篇文章写的是因为智能指针为null就会出现内存泄露 直接崩溃
场景的组织是一个根几点上边挂了很多子节点 2级树
调试的时候中断在启动渲染线程的那个地方
void TBOSG_DemoInitOSGRW::Render(void* ptr)
{
    TBOSG_DemoInitOSGRW* osg = (TBOSG_DemoInitOSGRW *)ptr;
    osgViewer::Viewer* viewer = osg->getViewer();
    while(!viewer->done())
    {
        viewer->frame();////This is break!
    }
         _endthread();
}
于是使用removeChildren函数
  root->removeChildren(6,1);///删除根节点中第6个子节点  但是它后面的7,8,9节点都被删除了
只想删除当前第6个节点。。

该用户从未签到

发表于 2009-8-13 16:37:19 | 显示全部楼层
不会删除别的,除非您的代码有问题

该用户从未签到

 楼主| 发表于 2009-8-13 17:02:50 | 显示全部楼层
您说的问题是指哪些?

该用户从未签到

 楼主| 发表于 2009-8-13 17:07:33 | 显示全部楼层
root->removeChildren(6,1);///删除根节点中第6个子节点  不是它后面的7,8,9节点都被删除了
是它前面的1,2,3,4,5都被删除了。只想删除当前第6个节点。。

该用户从未签到

发表于 2009-8-13 17:44:57 | 显示全部楼层
root->removeChildren(6,1)的意义是,删除索引号为6(也就是第7个)的子节点,它不会执行别的动作,除非您的代码让它执行了这些动作。

该用户从未签到

 楼主| 发表于 2009-8-13 17:51:59 | 显示全部楼层
是的  因为不断的点击btn 触发响应  不断的遍历节点上的子节点
谢谢array大师!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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