查看: 1336|回复: 7

智能指针卸载不干净的问题

[复制链接]

该用户从未签到

发表于 2010-11-5 15:17:09 | 显示全部楼层 |阅读模式
全部代码如下:
  1. class MyEventHandler : public osgGA::GUIEventHandler
  2. {
  3. protected:
  4. osg::ref_ptr<osg::Image> image;
  5. public:
  6. virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
  7. {
  8. switch(ea.getEventType())
  9. {
  10. case(osgGA::GUIEventAdapter::KEYDOWN):
  11. {
  12. if (ea.getKey() == osgGA::GUIEventAdapter::KEY_Up)
  13. {
  14. image = osgDB::readImageFile("dujuan.gif");
  15. }
  16. }
  17. }

  18. return false;
  19. }
  20. };

  21. int main()
  22. {
  23. osg::ref_ptr<osgViewer::Viewer>viewer = new osgViewer::Viewer();

  24. viewer->addEventHandler(new MyEventHandler);
  25. viewer->addEventHandler(new osgViewer::WindowSizeHandler);
  26. viewer->run();

  27. return 0;
  28. }
复制代码


这个程序在刚启动的时候内存占用9MB,执行一次KEY_UP后30MB,这都正常。
但是执行一段时间KEY_UP后,内存占用涨到100MB以上了,不理解。

不是有智能指针在管理吗?原来加载的IMAGE应该会因为引用计数变为零而自动卸载。为什么内存还是不断增长呢?

该用户从未签到

发表于 2010-11-5 15:30:29 | 显示全部楼层
关注ING

该用户从未签到

 楼主| 发表于 2010-11-5 15:42:35 | 显示全部楼层
我将GIF的图片换成PNG格式的,内存增长的问题就没有出现了。看来GIF插件出问题的可能性比较大!

该用户从未签到

 楼主| 发表于 2010-11-8 19:54:02 | 显示全部楼层
本帖最后由 aaa696 于 2010-11-8 19:57 编辑

没有人能说明一下原因吗?代码都在这里了。 我还是觉得GIF插件比纹理动画好用些,虽然原理都差不多。

该用户从未签到

发表于 2010-11-9 09:22:36 | 显示全部楼层
我已经检查了GIF插件并修正了里面的一个内存泄露错误,不是智能指针的原因,而是有一处malloc的内存没有释放。我已经提交了这个更改。

如果您急于自己实现gif插件的话,可以修改ReaderWriterGIF源代码,在
while (recordtype != TERMINATE_RECORD_TYPE);
一句之后加上:
  1. if ( *obj && obj ) delete [] buffer;
复制代码

该用户从未签到

 楼主| 发表于 2010-11-9 09:47:23 | 显示全部楼层
本帖最后由 aaa696 于 2010-11-9 10:14 编辑

测试过,现在没有出现内存泄露了。
非常感谢Array! 佩服,佩服。

该用户从未签到

发表于 2010-11-9 16:23:53 | 显示全部楼层
mark下~~要改插件了

该用户从未签到

发表于 2010-11-10 08:12:42 | 显示全部楼层
已经更新到最新的SVN版本中
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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