查看: 1323|回复: 3

如何delete掉一个回调指针?

[复制链接]

该用户从未签到

发表于 2010-11-2 14:25:53 | 显示全部楼层 |阅读模式
//定义一个最简单的node结点和一个NodeCallback
osg::Node* node = new  osg::Node;
osg::NodeCallback* nc = new  osg::NodeCallback;

//挂载回调,没什么问题
node -> setUpdateCallBack(nc );

//移除回调,以前一直这么做,也没什么问题
node -> setUpdateCallBack(NULL);
或node -> removeUpdateCallBack(nc );

//问题是此时的nc 指针不为空,内存没释放掉,准备释放

if (nc ) delete nc; //此处必崩

不知什么原因?求教!!谢谢!

该用户从未签到

发表于 2010-11-2 16:32:35 | 显示全部楼层
我想osg-users上已经很好地解释了您的问题,setUpdateCallBack之后回调对象就是通过节点内部的ref_ptr去管理了,当所有的节点不再引用它之后就会自动释放。如果您在这之后再手动执行delete,等同于对野指针进行操作

该用户从未签到

 楼主| 发表于 2010-11-2 18:16:21 | 显示全部楼层
本帖最后由 口口广大 于 2010-11-2 18:23 编辑

谢谢您在osg官方论坛的回答!我忘了osg::NodeCallback也可以用智能指针!

另外在函数A里声明和加载一个osg::ref_ptr<osg::NodeCallback>如下

void A()   
{

osg::ref_ptr<osg::NodeCallback> nc = new  osg::NodeCallback;
node(一个全局变量)->setupdatecallback(nc.get() );
}

在另一个函数B里释放掉这个回调,这样做是安全,不会产生内存泄露的吧?
void B()   
{

node(一个全局变量)->setupdatecallback(NULL);
}

该用户从未签到

发表于 2010-11-3 08:20:08 | 显示全部楼层
不会产生泄露
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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