查看: 1930|回复: 3

osg::Object setUserData之后内存释放问题

[复制链接]

该用户从未签到

发表于 2010-11-5 10:12:08 | 显示全部楼层 |阅读模式
本帖最后由 huyaoyu 于 2010-11-5 10:14 编辑

我使用目前最新版的OSG,利用VS2008在Win7 64bit机器上调试。在自己的项目中自己创建了一个类A,并且这个类A直接继承OSG::Referenced类。之后又新建了类B继承类A。最后我把指向类B的指针作为一个OSG::Object的对象的userdata(使用setUserData方法),但是在调试的时候发现类B的析构函数并没有被调用过。是不是这表示类B的实例没有被释放啊?创建类B的实例是是利用了
osg::ref_ptr<B> ptr = new B;
的方式,在给osg::Object的一个指针对象建立userdata时使用了
prtObject->setUserData(B.get());
的格式。
我看OSG的Doc上有说serUserData方法的解释,是这样的
Set user data, data must be subclassed from Referenced to allow automatic memory handling. If your own data isn't directly subclassed from Referenced then create an adapter object which points to your own object and handles the memory addressing.
它说要directly subclassed,是不是就是指一定要直接继承osg::Referenced啊?如何确定类B的指针已经被释放了?

该用户从未签到

发表于 2010-11-5 12:49:27 | 显示全部楼层
它说要directly subclassed,是不是就是指一定要直接继承osg::Referenced啊?
间接继承即可

如何确定类B的指针已经被释放了?
有很多办法,例如在析构函数里设置断点或打印信息之类。您的程序看起来不会有什么问题,但是只有prtObject被释放之后,B才会跟着释放,因此您可以考虑自己的调试方法是否合理

该用户从未签到

 楼主| 发表于 2010-11-5 14:56:07 | 显示全部楼层
2# array
我在B类的析构函数里放置了断点,但是程序调试中重来都没有进入过这个断点。这个调试需要注意什么吗?

该用户从未签到

发表于 2010-11-5 16:55:16 | 显示全部楼层
有的时候调试本身不会很准确,尤其是在程序整体退出的时候。

另一种可能是您没有卸载prtObject
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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