cocos2d-x 3.2 windows在程序退出时对鼠标移动事件的处理可能造成内存泄漏

cocos文档里推荐的退出方法是调用Director::getInstance()->end();

这个调用发生后退出的逻辑大概是:

  1. Director内部标志_purgeDirectorInNextLoop置位
  2. 下一个DisplayLinkDirector::mainloop()里调用purgeDirector()释放关闭一切

可是在Application::run()里的代码是这样的:

director->mainloop(); //释放一切,包括director instance
glview->pollEvent(); //处理事件

如果在这个瞬间有鼠标移动消息产生(虽然是小概率事件,如果是灵敏度高的鼠标还是比较容易发生的)
在pollEvent()调用里会重新初始化Director并最终导致内存泄漏!!!

如果上述两个函数调用的顺序上下颠倒一下,似乎问题就解决了。
或者增加程序退出的全局标志以及相应的判断逻辑,以避免类似的问题发生。

你为什么不在类析构的时候移除对鼠标事件的监听?这样才是正常的做法啊。 :4: :4: :4:

一楼正解 我在用鼠标事件的时候并未发现内存泄露问题

程序退出指的是整个应该关闭了吗?
如果是,你不需要考虑内存问题,这时的内存回收由操作系统负责

  1. 当然我可以自己写代码来处理这个问题。我提出这个问题并不是说自己没有办法了到这里来求助。
  2. cocos2d作为一个引擎不应该把这类处理留给使用者自己。最差的做法也应该在官方文档里写明哪些对象是需要显式释放或编写代码处理。

不敢苟同这个观点。要是脚本语言也就算了。C/C++嘛,除非有一天有正式的官方文档出台说C++也有回收机制了,delete可以deprecated了。

这跟编写语言无任何关系
我帮你找了一个贴子
http://bbs.csdn.net/topics/310089353
里面有详细的讨论
内存泄露有个前提条件,需要长期条件

@isGhost
谢谢你的意见。不过,写代码20多年,各种单机游戏和网游的项目也经历的不少了,我始终认为内存管理方面作为程序员应该有洁癖,不能因为外在的环境有所保证就放任不管了。与其去费心费力的分析哪些情况是有问题的,哪些情况是不会有问题的,不如把自己的代码里的每个分配和释放搞清楚。一个是事先预防,一个是事后找问题。虽然两种方式在一个软件的开发周期里都会存在,但事先预防做的好,事后的问题就少了。
这大概是个人风格吧。

另外,这里我本想讨论的是:作为一个游戏引擎应该如何对待资源的分配和清理。我认为既然是引擎隐式分配的资源,就应该由引擎隐式的释放,不应该让用户自己去琢磨到底哪里出了问题。
当然,现实中,各位包括我自己显然做了妥协,既然你引擎不管我就自己搞,实在不行,反正是开源的,直接改引擎好了。但是作为用户,我觉得还是应该让引擎的维护者和开发者们知道用户的想法,即使不会被认为是个问题。
目前就我学习cocos引擎短短几天的感受而言,cocos2d-x本身在资源的分配和清理上做的是很好的,而cocostudio在这方面与cocos2d-x整合的不够好,所以才会遇到这类问题。
当然,也很可能是我没有找到相关的资料文档,如果哪位有cocostudio关于此方面的文档,麻烦推介一下,谢谢!